Возможно ли множественное наследование в VB .Net? - PullRequest
14 голосов
/ 09 декабря 2008

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

Ответы [ 4 ]

18 голосов
/ 09 декабря 2008

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

Немного более длинный ответ: Да, если вы наследуете несколько интерфейсов и один базовый класс. Так как это обычно является причиной MI (вы хотите реализовать несколько интерфейсов), обычно этого достаточно. Тем не менее, в тех редких случаях, когда «настоящий» MI полезен, .NET мешает вам сделать это.

4 голосов
/ 09 декабря 2008

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

1 голос
/ 07 января 2013

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

Public Class ClassName
    Implements BaseInterface1, BaseInterface2

End Class

Это хорошо работает для классов, но я хотел бы иметь интерфейс, наследующий некоторые базовые интерфейсы. Примерно так:

Public Interface InterfaceName
    Implements BaseInterface1, BaseInterface2

End Interface

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

Public MustInherit Class InterfaceName
    Implements BaseInterface1, BaseInterface2

End Class

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

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

public interface InterfaceName: BaseInterface1, BaseInterface2 {}
1 голос
/ 17 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...