私は、.NET で継承/インターフェイス/実装をもう少しうまく理解しようとしています。
次のように定義されたクラスがあります(一種):
Public Class Sheet
Property Name As String
Property Steps As List(Of [Step])
End Class
問題は、[Step] は単なる仮想の基底クラスです。[Step] には 5 つの異なる具体的な実装があります。問題をもう少し複雑にするために、[Step] には 3 つの DIRECT 実装があり、そのうち 2 つは仮想です。これらの 2 つのそれぞれには、[Step] を具体的に実装する 2 つのサブクラスがあります。
それで、これがどのように見えるかです:
Step
|-----------------|-----------------|
| | |
SubStepA SubStepB SubStepC
|----|----| |----|----|
| | | |
SubStepAA SubStepAB SubStepCA SubStepCB
したがって、SubStepB、SubStepAA、SubStepAB、SubStepCA、および SubStepCB が具体的な実装です。
Clone() など、ANY Step に実行してもらいたいことがいくつかあります。
そこで、Step で次のように宣言してみました。
Public MustOverride Function Clone() As Step
問題は、SubStepAA でそれを実装しようとすると、次のように宣言できないことです。
Public Overrides Function Clone() As SubStepAA
これを行うと、戻り値の型が同じではないというエラーが表示されます。
これに対する解決策は、具体的なサブクラスを複製するたびに DirectCast 呼び出しを使用することですか? それは奇妙で満足できないようです。それも間違っているようです。つまり、SubStepAA オブジェクトのクローンを作成した場合、SubStepAA タイプのオブジェクトを取得したいと考えています。
これを行う方法があるはずですよね?つまり、各クラスを必要な方法で宣言するだけでよいと思いますが、(本質的に) 同じ方法で (本質的に) 同じように動作する 5 つの異なる Clone() メソッドを作成する必要があるのも間違っているようです (ディープ コピーの作成参照されたオブジェクトの)。
Interface宣言の使用を検討しましたが、同じタイプの不一致エラーが発生しているようです。
基本的なものが足りないと教えてください!
ありがとう!
余談ですが、私はいくつかの読書をしており、オブジェクトのディープコピーを行うためのより最適化された方法があるかもしれないことを認識しています (たとえば、シリアライゼーション/デシリアライゼーションを介して)。別のアプローチを使用してオブジェクトを複製します。