2008-12-08 13 views

Odpowiedz

16

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.

+6

Dziedziczenie interfejs nie jest to dziedziczenie chociaż ... –

+0

@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. –

+0

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

4

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.

1

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".

1

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 {} 
Powiązane problemy