Принудительное наследование 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 (), которые просто ПРОИЗОШЛИ работать (по существу) одинаково (создавая глубокую копию). указанного объекта) .I '

Мы изучали объявления интерфейса, но, похоже, они страдают от той же ошибки несоответствия типов.

Пожалуйста, скажи мне, что ям просто не хватает чего-то простого!

Спасибо!

Кроме того, я немного читаю и понимаю, что могут быть более оптимизированные способы создания глубоких копий объекта (например, посредством сериализации / десериализации), но я 'Меня все еще интересует этот вопрос, даже если я решу клонировать объекты, используя другой подход.

Ответы на вопрос(1)

Ваш ответ на вопрос