我有一个接口(定义为抽象基类),如下所示:
class AbstractInterface
{
public:
virtual bool IsRelatedTo(const AbstractInterface& other) const = 0;
}
我有一个实现(省略构造函数等):
class ConcreteThing
{
public:
virtual bool IsRelatedTo(const AbstractInterface& other) const
{
return m_ImplObject.has_relationship_to(other.m_ImplObject);
}
private:
ImplementationObject m_ImplObject;
}
AbstractInterface在项目A中形成一个接口,ConcreteThing作为该接口的实现存在于项目B中。这样,项目A中的代码可以访问项目B中的数据而不直接依赖它 - 项目B只需要实现正确的接口。
显然,IsRelatedTo函数体内的行无法编译 - ConcreteThing的实例有一个m_ImplObject成员,但它不能假设所有的AbstractInterface都有,包括other
参数。
在我的系统中,我可以实际上假设AbstractInterface的所有实现都是ConcreteThing(或其子类)的实例,但我不希望将对象按顺序转换为具体类型如果这个假设不再成立,那么以某种方式对私人成员进行编码或编码该假设,如果这种假设不再适用,将会崩溃。
我无法修改ImplementationObject,但我可以修改AbstractInterface和ConcreteThing。我也不能在转换之前使用标准RTTI机制来检查类型,或者为了类似的目的使用dynamic_cast。
我感觉我可以使用ConcreteThing参数重载IsRelatedTo
,但我不确定如何通过基本的IsRelatedTo(AbstractInterface)方法调用它。它不会被自动调用,因为它不是该方法的严格重新实现。
是否有一种模式可以在这里做我想要的事情,允许我通过IsRelatedTo
实现ImplementationObject::has_relationship_to(ImplementationObject)
功能,而不会冒险投射?
(另外,我想不出一个好的问题标题 - 如果你有更好的问题请改变它。)