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ł
Źle mówisz. Popraw się sam tylko najpierw przeczytaj jakąś książkę o podstawach.
Biały Szczur napisał(a):
W c# jest niemożliwe wielodziedziczenie interfejsów
przykład przeciwny:
[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
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#. ;)
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
Jeśli chcemy ciągnać filozoficzne rozważania, to "wielodziedziczenie intefejsów" w C# wyglądać może tylko tak:
interface IZiemniak : IRoślina, IJadalny, IMożnaZrobićFrytki
{
}
Jeden interfejs
A takie coś
class Ziemniak : IRoślina, IJadalny, IMożnaZrobićFrytki
{
}
to jest implementacja wielu interfejsów, a nie dziedziczenie. (Nie ma kodu, nie ma czego dziedziczyć.)
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ść.
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.
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
somekind napisał(a):
A takie coś
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ć" ;)
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...
Już można.
interface IDefaultInterfaceMethod
{
public void DefaultMethod()
{
Console.WriteLine("I am a default method in the interface!");
}
}
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? :)
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.
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.
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).
Dziedziczenie wielokrotne dotyczy jedynie interfejsów. Z kolei dana klasa może rozszerzać tylko jedną klasę