我是 C++ 新手,正在努力理解数据抽象与二进制方法(如相等)的结合。我想定义一个接口
class A {
public:
static A* Make(int);
virtual ~A() {};
virtual bool Eq(A*) = 0;
};
使用工厂模式,我可以隐藏实现:
class B : public A {
public:
B(int x) : x_(x) {}
bool Eq(A* a) {
return x_ == dynamic_cast<B*>(a)->x_;
}
private:
int x_;
};
A* A::Make(int x) {
return new B(x);
}
然后我可以使用抽象:
A* a = A::Make(1);
A* b = A::Make(2);
if (a->Eq(b)) {
cout << "Yes!" << endl;
} else {
cout << "No!" << endl;
}
然而,由于各种原因,动态演员阵容很糟糕。在我看来,最大的问题是可以用 C 子类化 A,然后将 C 类型的对象传递给 a->Eq,这将导致未定义的行为。我不知道如何定义二进制方法,以便代码可以访问两个对象的私有成员。我的直觉是这可以使用访问者模式来完成,但我无法提出解决方案。
对于那些了解 ML 的人,我基本上想做以下事情:
module A : sig
type t
val make: int -> t
val eq: t -> t -> bool
end = struct
type t = int
let make x = x
let eq x y = (x = y)
end