VB.NET Wymuszone dziedziczenie przez wiele pokoleń

Próbuję zawinąć głowę w dziedziczenie / interfejsy / implementację nieco lepiej w .NET.

Mam klasę zdefiniowaną w następujący sposób (rodzaj):

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

Chodzi o to, że [Step] jest tylko wirtualną klasą bazową. Istnieje 5 różnych konkretnych implementacji [Step]. Aby sprawy stały się nieco bardziej złożone, istnieją 3 implementacje DIRECT [Step], z których 2 są wirtualne. Każda z nich ma 2 podklasy, które konkretnie implementują [Step].

Oto jak to wygląda:

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

Tak więc SubStepB, SubStepAA, SubStepAB, SubStepCA i SubStepCB są konkretnymi implementacjami.

Jest kilka rzeczy, które chciałbym zrobić KAŻDY krok, takich jak Clone ().

Próbowałem więc zadeklarować następujące czynności w kroku:

Public MustOverride Function Clone() As Step

Problem polega na tym, że kiedy próbuję zaimplementować to w SubStepAA, nie mogę zadeklarować, co następuje:

Public Overrides Function Clone() As SubStepAA

Jeśli to zrobię, pojawia się błąd, że typy powrotu nie są takie same.

Czy rozwiązanie tego problemu polega na użyciu połączenia DirectCast w dowolnym momencie, kiedy klonuję konkretną podklasę? To wydaje się dziwne i niezadowalające. To też wydaje się złe. Chodzi mi o to, że jeśli sklonuję obiekt SubStepAA, chcę odzyskać obiekt typu SubStepAA.

Musi być jakiś sposób, żeby to zrobić, prawda? Chodzi mi o to, że mógłbym po prostu zadeklarować każdą klasę tak, jak powinna być, ale wydaje się również błędne, że muszę napisać 5 RÓŻNYCH metod Clone (), które po prostu DZIAŁAJĄ w ten sam sposób (zasadniczo) (tworzenie głębokiej kopii obiektu odniesienia).

Zajrzałem do deklaracji interfejsu, ale wydaje się, że cierpi na ten sam błąd niezgodności typów.

Proszę mi powiedzieć, że po prostu brakuje mi czegoś podstawowego!

Dzięki!

Na marginesie, robiłem trochę czytania i zdaję sobie sprawę, że mogą istnieć bardziej zoptymalizowane sposoby wykonywania głębokich kopii obiektów (np. Poprzez serializację / deserializację), ale nadal interesuje mnie to pytanie, nawet jeśli wybiorę klonuj obiekty używając innego podejścia.

questionAnswers(1)

yourAnswerToTheQuestion