C# wielokrotne dziedzictwo

C# wielokrotne dziedzictwo

Programiści mogą używać wielu dziedziczeń do konstruowania klas, które integrują funkcje z różnych klas i hierarchii. Jest to również pomocne, gdy zajęcia dla dzieci chce połączyć wiele kontraktów klasowych bazowych. Wielokrotne dziedziczenie nie jest obsługiwane w C#, ponieważ programiści uważają, że zwiększa to nadmierną złożoność języka. W języku programowania C# klasy mogą odziedziczyć tylko z jednej klasy nadrzędnej, która jest określana jako pojedyncze dziedzictwo.

Można jednak użyć interfejsów lub kombinacji klas i interfejsów, a interfejs (-y) następuje nazwa klasy w podpisie. Ten artykuł pokazuje, w jaki sposób można osiągnąć wielokrotne dziedziczenie w C#, wykorzystując różne podejścia.

Jakie są interfejsy C#

Wielokrotne dziedziczenie nie jest wykonalne w klasach, jak wiemy, ale można je osiągnąć w przypadku interfejsów, gdy używane jest słowo kluczowe interfejsu. Interfejs zawiera jedynie definicje metod, właściwości, zdarzeń i indeksów, ale nie podaje żadnej implementacji kodu. Nie możemy dodać modyfikatorów dostępu do członków interfejsu, ponieważ są one domyślnie publiczne i abstrakcyjne. Zmienne, stałe członkowie, konstruktorzy, destruktory i statyczne członki nie są dozwolone w interfejsie.

Znaczenie interfejsów C#

Interfejs nie jest tym samym jak klasa. Ma tylko sygnatury metody. Nie można go utworzyć, ponieważ nie ma żadnej implementacji. Klasy pochodzące z niego oferują logikę implementacji. Interfejs jest często uważany za klasę czystą abstrakcyjną. Jednak wykorzystanie interfejsu zamiast klasy abstrakcyjnej ma tę zaletę, że obsługuje wielokrotne dziedziczenie.

Jak wdrożyć interfejsy dla C# wielokrotne dziedzictwo

W języku C# istnieje wiele podejść do osiągnięcia wielu funkcji dziedziczenia. Aby poznać podstawy korzystania z interfejsów do wdrożenia wielu dziedziczeń, mamy niektóre programy na następujących ilustracjach:

Przykład nr 1: Wdrożenie dziedziczenia wielu klas

Staramy się wdrożyć wiele dziedzictwa w następującej klasie. Początkowo staramy się odziedziczyć właściwości pierwszej klasy nadrzędnej i drugiej klasy nadrzędnej na klasę dzieci. Jednak kompilator rzuci błąd czasu wykonywania, ponieważ C# nie obsługuje bezpośrednio wielu klas.

Uwzględniliśmy biblioteki systemów na początku kodu. Następnie stworzyliśmy klasę nadrzędną „owoce”, a także zdefiniowaliśmy metodę klasy jako „myfruits”. W metodzie „myFruits” utworzyliśmy listę jako „myList” i dodaliśmy różne elementy do listy, wykorzystując metodę dodawania. Pętla Foreach jest używana do iterowania każdego elementu na liście i przypisania pozycji listy do nowej zmiennej „Elementy”. Następnie stworzyliśmy inną klasę macierzystą, „FruitColors” i dostarczyliśmy metodę „kolory” do wdrożenia. Dodaliśmy również elementy na liście „kolorów” klasy, jak w poprzedniej klasie.

Teraz mamy klasę dziecka o nazwie „FruitDetails”, a ta klasa dziecięca dziedziczy dwie dane klasy rodziców. Ostatecznie mamy główną klasę „getdetail”, w której mamy główną metodę, i stworzyliśmy obiekt klasy „owoce” w głównej metodzie. Te obiekty wywołują tutaj metodę klasy nadrzędnej, która spowoduje dwuznaczność w kodzie.

W czasie kompilacji powyższy program rzuca wyjątek, że „klasy nie mogą mieć wielu klas podstawowych”, jak pokazano na poniższym obrazku:

Przykład nr 2: Implementacja interfejsu dla wielokrotnego dziedziczenia

Mimo że C# nie implementuje wielu dziedziczeń z klasami, możemy to osiągnąć za pomocą interfejsu. Chociaż interfejsy dają pełną abstrakcję, nie są w stanie uwzględnić określonych metod.

W poprzednim kodzie zbudowaliśmy interfejs ze słowem kluczowym „interfejs”, a interfejs otrzymuje nazwę „interfejs1”. Stworzyliśmy tylko metodę „nazwy” i nic więcej w interfejsie. Następnie zdefiniowaliśmy klasę nadrzędną „uczeń”, dla której utworzyliśmy interfejs. W klasie nadrzędnej dostarczyliśmy implementację metody „nazwy”. W metodzie „nazwy” mamy listę tablic przedstawionych jako „lista”, w której dodaliśmy losowe nazwy za pomocą metody dodawania. Writeline drukuje elementy listy. Pętla Foreach jest tutaj używana do iteracji każdego elementu listy za pomocą nowo utworzonej zmiennej „Wartości”.

Następnie utworzyliśmy kolejny interfejs „interfejs2” dla drugiej klasy nadrzędnej. Interfejs ma tylko metodę „badanych”. Mamy naszą drugą klasę nadrzędną, która implementuje metodę interfejsu „poddani”. Następnie dodaliśmy elementy na liście, jak w pierwszej klasie nadrzędnej. Następnie mamy „szczegóły” klasy dzieci, które dziedziczy dwa określone interfejsy, „interfejs1” i „interfejs2”. W klasie dziecięcej stworzyliśmy obiekty dla klas nadrzędnych i uzyskaliśmy dostęp do metod „nazw” i „podmiotów” bezpośrednio za pomocą tych obiektów. Metody „nazw” i „podmiotów” nie są modyfikowane, ponieważ interfejsy są dziedziczone przez klasę dzieci. Na końcu kodu mamy główną klasę „demo”, do deklarowania obiektów klasy dziecka i wyświetlania wyników.

Oto wyniki, które otrzymaliśmy z implementacji dziedziczenia wielu klas za pomocą interfejsów:

Przykład nr 3: Wdrożenie interfejsu dziedziczy inny interfejs

Dziedziczenie z jednego interfejsu do innego interfejsu jest możliwe w C#. Gdy klasa definiuje odziedziczony interfejs, musi zaimplementować wszystkich członków zadeklarowanych w łańcuchu spadków. Zauważ, że jeśli klasa używa interfejsu, wszystkie metody dostarczone przez ten interfejs należy zaimplementować wraz z metodami interfejsu podstawowego. W przeciwnym razie kompilator rzuca błąd. Gdy określono zarówno interfejs pochodny, jak i podstawowy, nazwa członka pochodnego interfejsu ukrywa nazwę członka interfejsu podstawowego.

W poprzednim kodzie zadeklarowaliśmy interfejs „książki” i stworzyliśmy metodę „book_no” w interfejsie. Zauważ, że nie zdefiniowaliśmy metody z żadnym specyfikatorem dostępu. Domyślnie metody interfejsu są publiczne. Jeśli przypiszmy do niego dowolny specyfikator dostępu, kompilator rzuca błąd. Następnie zaimplementowaliśmy inny interfejs „Detale”, który dziedziczy interfejs „Książki”. Mamy również metodę dla tego interfejsu. Klasa jest tworzona z nazwą „Autor”, dla której zaimplementowaliśmy poprzednie interfejsy. Klasa dziedziczy tylko „szczegóły” interfejsu, ale odziedziczyliśmy metody obu interfejsów tutaj. Ostatecznie zdefiniowaliśmy klasę sterownika „demo”, w którym utworzyliśmy obiekt dla klasy „autora” i nazwaliśmy te obiekty, aby uzyskać dostęp do metod klasowych „autora”. Następnie przekazaliśmy wartości tym metodom.

Poniżej znajduje się dane wyjściowe z dziedziczenia interfejsu do innego interfejsu:

Wniosek

Omówiliśmy koncepcję wielokrotnego dziedziczenia w C#. I dowiedzieliśmy się, że w C, tylko pojedyncze dziedzictwo jest dozwolone, chociaż można osiągnąć wiele dziedzictwa, jednocześnie wykorzystując jedno lub więcej interfejsów. Mamy jasną definicję interfejsu wraz z jego znaczeniem. Wdrożyliśmy również interfejs w przykładowym kodzie, aby pokazać, w jaki sposób interfejs można użyć w C#. Ponadto korzystanie z interfejsów jest bardzo pomocne, gdy ukrywają wdrożenie klasy przed światem zewnętrznym. Mam nadzieję, że dowiedziałeś się o wielokrotnym dziedziczeniu w C#. Więcej powiązanych tematów na temat C# są dostępne w Linux Wskazówka.