Pytanie Czy jest możliwe dziedziczenie wielokrotne w VB .Net?


Czy jest możliwe dziedziczenie wielokrotne w VB .Net? Jeśli tak, jaka jest składnia?


14
2017-12-08 22:50


pochodzenie




Odpowiedzi:


Krótka odpowiedź: Nie

Nieco dłuższa odpowiedź: Tak, jeśli dziedziczysz wiele interfejsów i jedną klasę podstawową. Ponieważ jest to zwykle powodem MI (chcesz wdrożyć wiele interfejsów), zwykle wystarczy. Jednak w tych rzadkich przypadkach, w których "prawdziwy" MI jest przydatny, NET uniemożliwia to.


18
2017-12-08 22:54



Dziedziczenie interfejsu nie jest tak naprawdę dziedziczeniem ... - Orion Edwards
@Orion Edwards: jak ci się nie podoba? Dziedziczenie definiuje relację "jest", a interfejsy to jeden ze sposobów definiowania, czym jest obiekt. Jeśli odziedziczę ISerializable, mówię "Jestem ISerializable", a traktowanie mnie jako ISerializable działa zgodnie z oczekiwaniami. - Harper Shelby
Oprócz komentarza @Harper Shelby, dobrowolne stosowanie tego rodzaju ograniczeń jest zwykle postrzegane jako najlepsza praktyka w C ++ (zamiast interfejsów masz czyste abstrakcyjne klasy bazowe). - Richard
@HarperShelby Inheritance, to także wtedy, gdy dziedziczysz wstępnie zdefiniowany kod. i daje takie same wyniki. Implementowanie interfejsów oznacza, że ​​nadal trzeba pisać kod we wcześniej zdefiniowanych metodach. Chociaż interfejsy wciąż mają te same sygnatury, mogą zawierać całkowicie inny kod i generować różne wyniki. Więc nie, to nie jest dziedziczenie. Przepraszam. - David Wilson
@DavidWilson, myślę, że sztucznie ograniczasz swoją definicję dziedziczenia. Użyłem wzorców takich jak Metoda szablonów w więcej niż jednym przypadku, gdzie trochę kod jest ponownie wykorzystywany, ale inne bity nie tylko nie są ponownie używane, ale nie są celowo definiowane w klasie bazowej. Obie podklasy zdecydowanie odziedziczyły bazę, ale miały bardzo różne implementacje i wyniki. - Harper Shelby


Jest to możliwe w sposób ograniczony w VB.Net w taki sam sposób, jak w C #: via Interfaces. Ponieważ interfejs działa zasadniczo na czysto abstrakcyjną klasę bazową, możesz dziedziczyć po tylu elementach, ile potrzebujesz iz jednej prawdziwej klasy.


4
2017-12-08 22:55





Prawdopodobnie to, co chcesz zrobić, to naprawdę kompozycja lub agregacja (patrz tutaj dla wzoru projektu). Może definiujesz zachowanie. Zawsze możesz zaimplementować interfejs SomeInterface w klasie bazowej, mieć element typu SomeInterface (który pozwala mu być dowolną klasą implementującą SomeInterface i może mieć kod implementujący), w konstruktorze członkowie przekazują odwołanie do klasy bazowej który jest właścicielem, jeśli jest to konieczne (jeśli to zrobisz, spróbuj dodać inny interfejs do zdefiniowania wywołań zwrotnych, klasa podstawowa go zaimplementuje, a podklasa będzie miała go jako typ zmiennej składowej). Użyj wywołań do klasy member, aby zaimplementować SomeInterface. W ten sposób kod jest implementowany w innej klasie, co ułatwia jego obsługę, ale nie dziedziczysz wielu dziedziczeń.

Ideą kompozycji jest to, że silnik nie jest samochodem, ale samochód ma silnik. Samochód potrzebuje silnika, ale nie musi wiedzieć, jak działa całe urządzenie silnikowe, tylko jak się z nim połączyć. Dlatego silnik nie powinien dziedziczyć z samochodu. Ale posiadanie silnika samochodu jest głupie. Samochód dostaje silnik jako członek całego samochodu, ale jako obiekt. Samochód ma silnik jako część jego składu.

Wygląda na to, że to raczej zachowanie, jak obiekt kaczkowaty, który ma zachowanie znachorstwa, ale gumowe kaczki to kaczki, ale nie kwakają, ale piszczą. Różnią się więc od obiektów krzyżówek, ale obie mają wiele wspólnych cech. Więc chcesz mieć interfejs typu "quack", który każdy implementuje inaczej. Ale wiele kaczek będzie znudzić się tym interfejsem, więc nie chcesz pisać dla każdego z nich. W tym miejscu używasz kompozycji, aby zaimplementować interfejs zachowania znachorstwa.


1
2017-07-17 06:11





O ile mi wiadomo, VB.net nie obsługuje ogólnie dziedziczenia wielokrotnego, ale można osiągnąć rodzaj dziedziczenia wielokrotnego poprzez pracę z interfejsami (za pomocą "Narzędzi" zamiast "Dziedziczenia"):

Public Class ClassName
    Implements BaseInterface1, BaseInterface2

End Class

To działa dobrze dla klas, ale chciałbym mieć interfejs dziedziczący niektóre interfejsy podstawowe. Coś w tym stylu:

Public Interface InterfaceName
    Implements BaseInterface1, BaseInterface2

End Interface

Ale słowo kluczowe "Implements" nie jest dozwolone dla interfejsów (co oczywiście ma sens). Próbowałem użyć pewnego rodzaju abstrakcyjnej klasy, którą znam z Javy:

Public MustInherit Class InterfaceName
    Implements BaseInterface1, BaseInterface2

End Class

Ale teraz muszę wdrożyć określone metody z BaseInterface1 i BaseInterface2 w klasie InterfaceName. Ale jako InterfaceName powinien być również interfejs, nie chcę, aby wdrożyć te metody w tej klasie.

W języku C # możesz to zrobić całkiem łatwo:

public interface InterfaceName: BaseInterface1, BaseInterface2 {}

1
2018-01-07 04:39