VB.NET Forced Inheritance über mehrere Generationen hinweg

Ich versuche, mich ein bisschen besser mit Vererbung / Schnittstellen / Implementierung in .NET zu beschäftigen.

Ich habe eine Klasse, die wie folgt definiert ist:

Public Class Sheet
    Property Name As String
    Property Steps As List(Of [Step])
End Class

Die Sache ist, [Step] ist nur eine virtuelle Basisklasse. Es gibt 5 verschiedene konkrete Implementierungen von [Step]. Um die Sache etwas komplexer zu gestalten, gibt es 3 DIRECT-Implementierungen von [Step], von denen 2 virtuell sind. Jede dieser 2 hat 2 Unterklassen, die konkret [Step] implementieren würden.

So sieht es also aus:

                          Step
         |-----------------|-----------------|
         |                 |                 |
     SubStepA          SubStepB          SubStepC
    |----|----|                         |----|----|
    |         |                         |         |
SubStepAA SubStepAB                 SubStepCA SubStepCB

SubStepB, SubStepAA, SubStepAB, SubStepCA und SubStepCB sind also die konkreten Implementierungen.

Es gibt ein paar Dinge, die ich mit JEDEM Schritt tun möchte, wie z. B. Clone ().

Also habe ich versucht, Folgendes in Step zu deklarieren:

Public MustOverride Function Clone() As Step

Das Problem ist, dass ich beim Versuch, dies in SubStepAA zu implementieren, Folgendes nicht deklarieren kann:

Public Overrides Function Clone() As SubStepAA

Wenn ich das tue, erhalte ich eine Fehlermeldung, dass die Rückgabetypen nicht gleich sind.

Ist die Lösung dafür, einfach einen DirectCast-Aufruf zu verwenden, wenn ich eine konkrete Unterklasse klone? Das scheint seltsam und unbefriedigend. Es scheint auch nur falsch. Ich meine, wenn ich ein SubStepAA-Objekt klone, möchte ich ein Objekt vom Typ SubStepAA zurückbekommen.

Dafür muss es einen Weg geben, oder? Ich denke, ich könnte einfach jede Klasse so deklarieren, wie sie sein muss, aber es scheint auch falsch zu sein, 5 VERSCHIEDENE Clone () - Methoden zu schreiben, die sich einfach HAPPEN (im Wesentlichen) auf die gleiche Weise verhalten (eine tiefe Kopie erstellen) des referenzierten Objekts).

Ich habe versucht, Interface-Deklarationen zu verwenden, aber diese scheinen unter dem gleichen Typinkonflikt zu leiden.

Bitte sag mir, dass mir nur etwas Grundlegendes fehlt!

Vielen Dank!

Abgesehen davon habe ich ein bisschen gelesen und festgestellt, dass es möglicherweise optimierte Möglichkeiten gibt, tiefe Kopien von Objekten zu erstellen (z. B. durch Serialisierung / Deserialisierung), aber diese Frage interessiert mich immer noch, selbst wenn ich mich dafür entscheide Klonen von Objekten mit einem anderen Ansatz.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage