我有一个如下所示的接口(定义为抽象基类):
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 成员,但它不能假设所有 AbstractInterfaces 都这样做,包括other
参数。
在我的系统中,我实际上可以假设 AbstractInterface 的所有实现都是 ConcreteThing (或其子类)的实例,但我不希望将对象强制转换为具体类型以获取私有成员,或对其进行编码如果这个假设不再成立,那么假设以后会在没有诊断的情况下崩溃。
我无法修改 ImplementationObject,但可以修改 AbstractInterface 和 ConcreteThing。我也不能使用标准的 RTTI 机制在转换之前检查类型,或者将 dynamic_cast 用于类似目的。
我有一种感觉,我可以IsRelatedTo
用 ConcreteThing 参数重载,但我不确定如何通过基本 IsRelatedTo(AbstractInterface) 方法调用它。它不会被自动调用,因为它不是对该方法的严格重新实现。
是否有一种模式可以在这里做我想做的事,允许我IsRelatedTo
通过 来实现该功能ImplementationObject::has_relationship_to(ImplementationObject)
,而没有危险的演员表?
(另外,我想不出一个好的问题标题——如果你有更好的标题,请更改它。)