私は、これらのクラスを知らなくても、他のクラスから情報を取得する必要があるC++モジュールを持っています。明白なアプローチはインターフェイスを使用することです。多くの仮想メソッドを持つ1つのインターフェイスを持っていますか?または、仮想メソッドが1つしかない多くのインターフェイスを使用していますか?
例を挙げておきます。すべての図書に独自の特性と機能があり、図書の特性を実現したり、機能を実行させたりするためには、図書にインターフェースを実装する必要があります。このように:
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;
};
残念ながら、残念ながら、すべての種類の書籍にこれらのすべての方法を実装することは意味がありません。
- いくつかの書籍がそう、
- 一部の本はいくつかの本を購入することはできませんISBNコード
- を持っていない(私はgetNofImagesは()を実装する必要はありません)の画像を持っていません私は1つのだけのインタフェースを持っているので、彼らはいくつかの本はいくつかの本をPDF
に変換することはできません
代替は、このように、多くのインターフェイスでこれらのインタフェースを分割することができます
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);
:図書館に本を追加する
は、このようなものになりそれは単にサポートされていません。
しかし、すべての本は特性/機能の可能な組み合わせを持つことができるので、私は1つの方法で多くのインターフェースを完成させます。
インターフェイスを整理してこのようなものを得るためのより良い方法はありませんか?
ラムダ式の使用についても考えていましたが、画面の背後でこれは1つの方法で多くのインターフェイスを持つこととほとんど同じです。
アイデア?
は完全に同意し、本が自然に潜在的にISBNや価格を有していると考えられています。 ISBNがあり、そのISBN値が何であるかは、購入可能かどうか、また価格は何かを質問したい特定の本があるとすれば、それらの操作は意味的に 'IBook'インターフェースに属します。異なる視点から、 'ISBNGetter'インターフェースを持つことは、異なるオブジェクトがISBNを持つかもしれないが、本だけがそれを持っているように思えます。 'IBook'ではないオブジェクトに対して余分なインターフェースを使用する状況はありません。 –
@dribeas:はい、 'IISBNGetter'が' IBook'から派生しているのは、余分なインターフェースを持っていても価値があるかもしれません。私はISBN-13はUPCと互換性があると思う。もしそうなら、 'IUPCGetter'はより一般的で、' IBuyable'は確かにです。 'IBuyable'は、すべての本がそれを実装しているかどうか、または一部しか実装していないかどうかにかかわらず、価値のあるインターフェースになるかもしれません。 –