インターフェイスへの参照/ポインタとして提示されたオブジェクトがあります。インターフェイスを変更したり、カプセル化を壊したり、恐ろしいハックを書いたりせずに、具体的なオブジェクトのメソッドが存在する場合は、そのメソッドを呼び出したいと思います。どうすればそれができますか?
例を次に示します。
私はインターフェースを持っています:
class IChatty
{
public:
virtual ~IChatty() {};
virtual std::string Speak() const = 0;
};
そして、このインターフェースの複数の具体的な実装:
class SimpleChatty : public IChatty
{
public:
~SimpleChatty() {};
virtual std::string Speak() const override
{
return "hello";
}
};
class SuperChatty : public IChatty
{
public:
void AddToDictionary(const std::string& word)
{
words_.insert(word);
}
virtual std::string Speak() const override
{
std::string ret;
for(auto w = words_.begin(); w != words_.end(); ++w )
{
ret += *w;
ret += " ";
}
return ret;
}
private:
std::set<std::string> words_;
};
このメソッドは、別の新しいインターフェイスに含めることができますがSuperChatty::AddToDictionary
、抽象インターフェイスには存在しません。IChatty
現実の世界では、これらのオブジェクトはファクトリを通じて構築され、それ自体が抽象的なインターフェイスの具体的なインスタンス化です。ただし、当面の問題に直交する目的のために:
int main()
{
IChatty* chatty = new SuperChatty;
chatty->AddToDictionary("foo");
std::cout << chatty->Speak() << std::endl;
}
AddToDictionary
はIChatty
インターフェースの一部ではない (そして、その一部にすることはできない)ので、私はそれを呼び出すことができます。
カプセル化を壊したり、恐ろしいハックを書いたり、その他の設計上のショートカットを使用したりせずAddToDictionary
に、ポインターを呼び出すにはどうすればよいでしょうか?chatty
注: 現実の世界では、辞書はSuperChatty
オブジェクト自体の一部であり、それから分離することはできません。
注2:具象型にダウンキャストしたくありません。