c – 有一个接口有很多虚拟方法吗?或者只有一个虚拟方法有很多接口?

我有一个C模块需要从其他类获取信息,而不知道这些类.显而易见的方法是使用接口.

让我给你举个例子.假设我有一个管理书籍的图书馆,所有图书都有自己的特点和功能,并且为了让图书馆能够从书中获得特色或执行功能,本书需要实现一个界面.像这样:

class Library
   {
   public:
      void addBook(IBook &book);
   };

class IBook
   {
   public:
      string getAuthor()    = 0;
      string getTitle()     = 0;
      string getISBNCode()  = 0;
      size_t getNofPages()  = 0;
      size_t getNofImages() = 0;
      double getPrice()     = 0;
      void   printBook()    = 0;
      void   convertToPdf() = 0;
   };

不幸的是,对所有类型的书籍实施所有这些方法都没有意义.

>有些书没有图像(所以我不想实现getNofImages())
>有些书没有ISBN代码
>有些书不能买,所以没有价格
>有些书无法打印
>有些书籍无法转换为PDF

因为我只有1个接口,所以我被迫为所有书籍实现所有内容并返回0,返回“”或者如果它不相关则不执行任何操作.

另一种方法是在许多接口中拆分这些接口,如下所示:

class IBook
   {
   public:
      string getAuthor()    = 0;
      string getTitle()     = 0;
      size_t getNofPages()  = 0;
   };

class IISBNGetter
   {
   public:
      string getISBNCode()  = 0;
   };

class IImagesGetter
   {
   public:
      size_t getNofImages() = 0;
   };

class IBuyable
   {
   public:
      double getPrice()     = 0;
   };

class IPrintable
   {
   public:
      void   printBook()    = 0;
   };

class IConvertible
   {
   public:
      void   convertToPdf() = 0;
   };

然后,书籍类只需要实现他们真正想要支持的界面.

将书添加到库然后变成这样:

bookid = myLibrary->addBook (myBook);
myLibrary->setISBNGetter  (bookid, myBook);
myLibrary->setImageGetter (bookid, myBook);
myLibrary->setBuyable     (bookid, myBook);

具有不同接口的优点在于,对于支持什么的库来说很明显,并且它永远不会有调用不受支持的东西的风险.

但是,由于每本书都可以具有任何可能的特征/功能组合,我最终只有一种方法的大量接口.

是不是有更好的方法来组织接口来获得这样的东西?

我也在考虑使用Lambda表达式,但在屏幕后面这几乎与只有1个方法的许多接口相同.

有任何想法吗?

最佳答案
我有IBook来实现每个方法:

class IBook
   {
   public:
      virtual ~IBook() {}

      virtual string getAuthor() { return ""; } // or some other meaningful default value
      virtual string getTitle() { return ""; }
      virtual string getISBNCode() { return ""; }
      virtual size_t getNofPages() { return 0; }
      virtual size_t getNofImages() { return 0; }
      virtual double getPrice() { return .0; }
      virtual void   printBook() {}
      virtual void   convertToPdf() {}
   };

因为你的替代方案对我来说太乱了,你会以很多令人困惑的界面结束.另外,您可以检查Visitor pattern是否可以应用于此处.

转载注明原文:c – 有一个接口有很多虚拟方法吗?或者只有一个虚拟方法有很多接口? - 代码日志