Czy jest możliwe dziedziczenie wielokrotne w VB .Net? Jeśli tak, jaka jest składnia?Czy jest możliwe dziedziczenie wielokrotne w VB .Net?
Odpowiedz
Krótka odpowiedź: Nie
Nieco dłużej odpowiedź: Tak, jeśli dziedziczą wiele interfejsów, a jedną klasę bazową. 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.
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.
Prawdopodobnie to, co chcesz zrobić, to kompozycja lub agregacja (patrz here for design pattern). 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 je miała 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 co robisz, to raczej zachowanie, jak obiekt kaczkowaty, który ma zachowanie znachora, 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. To tutaj używasz kompozycji do implementacji interfejsu zachowania typu "quack".
O ile wiem VB.net nie obsługuje wielokrotnego dziedziczenia w ogóle, ale można dotrzeć do rodzaju wielokrotne dziedziczenie przez pracę z interfejsów (za pomocą „Implements” zamiast „dziedziczy”):
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 ma sens, oczywiście). Próbowałem użyć rodzaj klasy abstrakcyjnej, które znam od Java:
Public MustInherit Class InterfaceName
Implements BaseInterface1, BaseInterface2
End Class
Ale teraz muszę realizować określone metody z BaseInterface1 i BaseInterface2 w klasie nazwa_interfejsu. Ale jako InterfaceName powinien być również interfejs, nie chcę, aby wdrożyć te metody w tej klasie.
W języku C# można to zrobić dość łatwo:
public interface InterfaceName: BaseInterface1, BaseInterface2 {}
- 1. .net Dziedziczenie wielokrotne z klas abstrakcyjnych
- 2. C# wielokrotne dziedziczenie
- 3. C# Dziedziczenie wielokrotne
- 4. metaklasa wielokrotne dziedziczenie niespójność
- 5. Python Wielokrotne dziedziczenie
- 6. Czyste wirtualne dziedziczenie, wielokrotne dziedziczenie i C4505
- 7. Wielokrotne dziedziczenie pająków do scrapy
- 8. Wielokrotne dziedziczenie klasy niejednoznaczne baza
- 9. Java ORM: Wielokrotne dziedziczenie (interfejs)
- 10. C++ dziedziczenie wielokrotne zapobiegania diament
- 11. C++ dziedziczenie wielokrotne Funkcja łączenia
- 12. VB .net, SELECT, domyślnie
- 13. Jak zaimplementować dziedziczenie wielokrotne w delphi?
- 14. Mocowanie C++ Wielokrotne dziedziczenie Niejednoznaczne połączeń
- 15. VB .NET obliczania inaczej Java
- 16. C++ wirtualny układ tabeli MI (wielokrotne dziedziczenie)
- 17. Niejasna definicja operatora() z wielokrotne dziedziczenie
- 18. Wielokrotne dziedziczenie Pythona: Wybranie, które super() wywołanie
- 19. Jaki jest najlepszy sposób obliczenia rozmiaru katalogu w VB .NET?
- 20. Czy w Protobuf-net możliwe jest serializowanie nieprzypisanych klas?
- 21. Czy można bezpiecznie uzyskać wartość SecureString z VB .NET?
- 22. ReSharper dla wyjaśniając "Możliwe wielokrotne wyliczanie IEnumerable"
- 23. Czy jest możliwe wykonanie zestawu .NET (dll) z vbscript?
- 24. Czy jest możliwe, aby projekt C# używał wielu wersji .NET?
- 25. Dziedziczenie interfejsu/hierarchie w .Net - czy istnieje lepszy sposób?
- 26. Konwersja dateTime liczba sekund VB NET
- 27. serializacji XML .NET i dziedziczenie
- 28. Czy są możliwe wszystkie serializery .NET?
- 29. Wielokrotne dziedziczenie wirtualne i wywołanie konstruktora klasy bazowej
- 30. Czy w jakiś sposób możliwe jest dziedziczenie kodu końcowego modyfikującego klasę?
Dziedziczenie interfejs nie jest to dziedziczenie chociaż ... –
@Orion Edwards: jak to jest, nie? 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. –
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