我有一个对象作为接口的引用/指针。如果该方法存在,我想在具体对象上调用该方法,而无需更改接口、破坏封装或编写任何可怕的 hack。怎么做到呢?
这是一个例子。
我有一个界面:
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
不破坏封装、编写一些可怕的 hack 或采用任何其他设计快捷方式的情况下调用指针?
注意:在现实世界中,字典是SuperChatty
对象本身的一部分,不能与它分开。
NOTE2:我不想贬低具体类型。