Подтвердить что ты не робот

Возможно ли множественное наследование в VB.Net?

Возможно ли множественное наследование в VB.Net? Если да, то какой синтаксис?

4b9b3361

Ответ 1

Короткий ответ: Нет

Слегка длинный ответ: Да, если вы наследуете несколько интерфейсов и один базовый класс. Поскольку это обычно является причиной MI (вы хотите реализовать несколько интерфейсов), это обычно достаточно. Однако в тех редких случаях, когда "реальный" MI полезен,.NET запрещает вам это делать.

Ответ 2

Это возможно в ограниченном режиме в VB.Net так же, как и в С#: через интерфейсы. Поскольку интерфейс работает по существу с чистым абстрактным базовым классом, вы можете наследовать столько же, сколько вам нужно, и из одного реального класса.

Ответ 3

Вероятно, что вы хотите сделать, это действительно композиция или агрегация (см. здесь для шаблона дизайна). Возможно, вы определяете поведение. Вы всегда можете реализовать интерфейс SomeInterface в базовом классе, иметь член типа SomeInterface (который позволяет ему быть любым классом, который реализует SomeInterface и, следовательно, может иметь код, реализующий), в конструкторе членов передают ссылку на базовый класс (если это необходимо, попробуйте добавить другой интерфейс для определения обратных вызовов, базовый класс будет реализовывать его, а подкласс будет иметь его как тип переменной-члена). Используйте вызовы классу-члену для реализации SomeInterface. Таким образом, код реализуется в другом классе, что упрощает его поддержку, но вы не выполняете множественное наследование.

Идея композиции заключается в том, что двигатель - это не автомобиль, а автомобиль имеет двигатель. Автомобилю нужен двигатель, но ему не нужно знать, как работает весь блок двигателя, только как с ним взаимодействовать. Поэтому двигатель не должен унаследовать от автомобиля. Но с машиной реализовать двигатель глупо. Таким образом, автомобиль получает двигатель как член всей машины, но как объект. Автомобиль имеет двигатель как часть его состава.

Похоже, что то, что вы делаете, скорее похоже на поведение, такое как утиный объект, у которого есть шарлатанство, но резиновые утки - утки, но не шарлатаются, но скрипят. Таким образом, они отличаются от объектов mallard, но оба имеют много других функций утки. Таким образом, вы хотите иметь интерфейс quack, который каждый реализует по-разному. Но многие утки будут крякать для этого интерфейса, так что вы не хотите писать quack для каждого из них. Это то, где вы используете композицию для реализации интерфейса поведения quack.

Ответ 4

Насколько я знаю, VB.net не поддерживает множественное наследование вообще, но вы можете достичь своего рода множественного наследования, работая с интерфейсами (используя "Реализует" вместо "Наследует" ):

Public Class ClassName
    Implements BaseInterface1, BaseInterface2

End Class

Это отлично работает для классов, но Id любит иметь интерфейс, наследующий некоторые базовые интерфейсы. Что-то вроде этого:

Public Interface InterfaceName
    Implements BaseInterface1, BaseInterface2

End Interface

Но ключевое слово "Реализует" не допускается для интерфейсов (что, конечно, имеет смысл). Я попытался использовать какой-то абстрактный класс, который я знаю из Java:

Public MustInherit Class InterfaceName
    Implements BaseInterface1, BaseInterface2

End Class

Но теперь мне нужно реализовать определенные методы из BaseInterface1 и BaseInterface2 в классе InterfaceName. Но поскольку InterfaceName также должен быть интерфейсом, я не хочу реализовывать эти методы в этом классе.

В С# вы можете сделать это довольно просто:

public interface InterfaceName: BaseInterface1, BaseInterface2 {}