Wielodziedziczenie interfejsów w C# i Java

Wielodziedziczenie interfejsów w C# i Java
  • Rejestracja: dni
  • Ostatnio: dni
0

W c# jest niemożliwe wielodziedziczenie interfejsów, natomiast jest możliwe zwykłe dziedziczenie interfejsów. Podobnie jest w javie. Dobrze mówię? Jeśli nie prosze aby ktoś mnie poprawił

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
3

Źle mówisz. Popraw się sam tylko najpierw przeczytaj jakąś książkę o podstawach.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
3
Biały Szczur napisał(a):

W c# jest niemożliwe wielodziedziczenie interfejsów

przykład przeciwny:

Kopiuj
[Serializable]
public class List<T> : System.Collections.Generic.ICollection<T>,
System.Collections.Generic.IEnumerable<T>,
System.Collections.Generic.IList<T>,
System.Collections.Generic.IReadOnlyCollection<T>,
System.Collections.Generic.IReadOnlyList<T>,
System.Collections.IList

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=netframework-4.7.2

GironX
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 59
2

Właściwie w C# nie można dziedziczyć interfejsów, tylko je implementować.Dziedziczenie dotyczy klas. I to właśnie wielodziedziczenie klas jest niedozwolone w C#. ;)

elwis
  • Rejestracja: dni
  • Ostatnio: dni
0
GironX napisał(a):

Właściwie w C# nie można dziedziczyć interfejsów, tylko je implementować.Dziedziczenie dotyczy klas. I to właśnie wielodziedziczenie klas jest niedozwolone w C#. ;)

Podobnie w Javie. Można dziedziczyć z jednej klasy, a implementować tyle interfejsów co chcesz. To brzmi dość rozsądnie. Jeśli chcesz dziedziczyć z większej ilości klas to prawdopodobnie architektura kuleje, w każdym razie jeszcze nigdy nic takiego do głowy mi nie przyszło. :P

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

Jeśli chcemy ciągnać filozoficzne rozważania, to "wielodziedziczenie intefejsów" w C# wyglądać może tylko tak:

Kopiuj
interface IZiemniak : IRoślina, IJadalny, IMożnaZrobićFrytki
{
}

Jeden interfejs

A takie coś

Kopiuj
class Ziemniak : IRoślina, IJadalny, IMożnaZrobićFrytki
{
}

to jest implementacja wielu interfejsów, a nie dziedziczenie. (Nie ma kodu, nie ma czego dziedziczyć.)

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
0

Kontynuując filozoficzne rozważania:

Dziedziczenie jest przejęciem częściowo lub w całości zachowania klasy bazowej.

Implementacja interfejsu to jest deklarowanie, że robisz to lub tamto, albo masz taką albo inną właściwość.

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
1

kończąc filozoficzne a raczej na bazie faktu odnośnie języka C# (tl;dr @somekind ma racje)

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/

By using interfaces, you can, for example, include behavior from multiple sources in a class. That capability is important in C# because the language doesn't support multiple inheritance of classes.

oraz

However, a class or struct can implement multiple interfaces, but a class can inherit only a single class, abstract or not. Therefore, by using interfaces, you can include behavior from multiple sources in a class.

oraz

A class or struct can implement multiple interfaces. A class can inherit a base class and also implement one or more interfaces.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

to jest implementacja wielu interfejsów, a nie dziedziczenie. (Nie ma kodu, nie ma czego dziedziczyć.)

W Javie 8 interfejs może zawierać zaimplementowane metody: https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

V-2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 671
0
somekind napisał(a):

A takie coś

Kopiuj
class Ziemniak : IRoślina, IJadalny, IMożnaZrobićFrytki
{
}

to jest implementacja wielu interfejsów, a nie dziedziczenie. (Nie ma kodu, nie ma czego dziedziczyć.)

O ile konwencja nazewnicza rzeczywiście przychyla się do tego, by to nazywać implementacją, o tyle nie wydaje mi się, by sprowadzało się to do kwestii braku kodu (u rodzica), bo jeśli odziedziczę z pustej klasy abstrakcyjnej, to też "nie ma kodu, nie ma czego dziedziczyć" ;)

WeiXiao
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5227
0
Wibowit napisał(a):

to jest implementacja wielu interfejsów, a nie dziedziczenie. (Nie ma kodu, nie ma czego dziedziczyć.)

W Javie 8 interfejs może zawierać zaimplementowane metody: https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

Wow, to prawie jak w C# 8...

@somekind

Już można.

Kopiuj
interface IDefaultInterfaceMethod
{
    public void DefaultMethod()
    {
       Console.WriteLine("I am a default method in the interface!");
    }
}
somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
0
V-2 napisał(a):

jeśli odziedziczę z pustej klasy abstrakcyjnej, to też "nie ma kodu, nie ma czego dziedziczyć" ;)

To po co w takim razie pusta klasa abstrakcyjna? :)

AF
  • Rejestracja: dni
  • Ostatnio: dni
1
V-2 napisał(a):

"nie ma kodu, nie ma czego dziedziczyć" ;)

Jest co dziedziczyć — tożsamość.

Ogólnie przy językach z większymi możliwościami można rozróżnić dziedziczenie interfejsu, implementacji, stanu i tożsamości. Java ma wielodziedziczenie interfejsu i (w ograniczonym stopniu) implementacji, ma jednodziedziczenie stanu i tożsamości. C# nie ma jeszcze wielodziedziczenia implementacji, poza tym jest jak Java. A jak zaczniemy wykłócać się o słowa jeszcze bardziej, to można zacząć analizować różnice między językami klasowymi a obiektowymi, subclassing vs subtyping i inne takie.

Ale jak trzymamy się nomenklatury C#, to nie ma tam wielodziedziczenia.

V-2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 671
0
somekind napisał(a):
V-2 napisał(a):

jeśli odziedziczę z pustej klasy abstrakcyjnej, to też "nie ma kodu, nie ma czego dziedziczyć" ;)

To po co w takim razie pusta klasa abstrakcyjna? :)

Na zasadzie podobnej jak marker interface. Zresztą to, czy ku takiej decyzji projektowej istnieje dobry powód, nie zmienia chyba faktu, czy mamy do czynienia z dziedziczeniem, czy też nie. Dziedziczenia klas można używać bezsensownie (i dzieje się to częściej, niż powinno).

Afish napisał(a):
V-2 napisał(a):

"nie ma kodu, nie ma czego dziedziczyć" ;)

Jest co dziedziczyć — tożsamość.

Tak samo jak przy implementacji interfejsu - to też relacja is-a.

AF
  • Rejestracja: dni
  • Ostatnio: dni
0
V-2 napisał(a):

Tak samo jak przy implementacji interfejsu - to też relacja is-a.

Przy tożsamości chodzi o konstruktor, nie o zgodność na poziomie struktury (subtyping).

Ares02
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Dziedziczenie wielokrotne dotyczy jedynie interfejsów. Z kolei dana klasa może rozszerzać tylko jedną klasę

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.