私は 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;
}
ただし、動的キャストはさまざまな理由で最悪です。私が見た最大の問題は、A を C でサブクラス化し、型 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