Принудительное наследование VB.NET через несколько поколений
Я пытаюсь лучше обдумать наследование / интерфейсы / реализацию в .NET.
У меня есть класс, который определяется следующим образом (вроде):
Public Class Sheet
Property Name As String
Property Steps As List(Of [Step])
End Class
Дело в том, что [Step] - это просто виртуальный базовый класс. Существует 5 различных конкретных реализаций [Step]. Чтобы усложнить задачу, есть 3 ПРЯМЫХ реализации [Step], 2 из которых являются виртуальными. У каждого из этих 2 есть 2 подкласса, которые конкретно реализуют [Step].
Итак, вот как это выглядит:
Step
|-----------------|-----------------|
| | |
SubStepA SubStepB SubStepC
|----|----| |----|----|
| | | |
SubStepAA SubStepAB SubStepCA SubStepCB
Итак, SubStepB, SubStepAA, SubStepAB, SubStepCA и SubStepCB являются конкретными реализациями.
Есть пара вещей, которые я бы хотел, чтобы ЛЮБОЙ Шаг сделал, например, Clone ().
Итак, я попытался объявить следующее в шаге:
Public MustOverride Function Clone() As Step
Проблема в том, что, когда я пытаюсь реализовать это в SubStepAA, я не могу объявить следующее:
Public Overrides Function Clone() As SubStepAA
Если я это сделаю, я получу ошибку, что возвращаемые типы не совпадают.
Является ли решение этой проблемы просто использовать вызов DirectCast каждый раз, когда я клонирую конкретный подкласс? Это кажется странным и неудовлетворительным. Это также кажется неправильным. Я имею в виду, если я клонирую объект SubStepAA, я хочу вернуть объект типа SubStepAA.
Должен быть способ сделать это, верно? Я имею в виду, я думаю, я мог бы просто объявить каждый класс таким, каким он должен быть, но также кажется неправильным писать 5 РАЗЛИЧНЫХ методов Clone (), которые просто ПРОИЗОЙДУТ работать (по существу) одинаково (создавая глубокую копию). указанного объекта).
Я рассмотрел использование объявлений интерфейса, но, похоже, страдает от той же ошибки несоответствия типов.
Пожалуйста, скажите мне, что я просто упускаю что-то простое!
Спасибо!
Кроме того, я немного читаю и понимаю, что могут быть более оптимизированные способы делать глубокие копии объекта (например, посредством сериализации / десериализации), но я все еще интересуюсь этим вопросом, даже если я решу клонировать объекты, используя другой подход.