Wielodziedziczenie interfejsów w C# i Java

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ł

3

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

3
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

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

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#. ;)

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

1

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ć.)

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ść.

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.

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

0
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ć" ;)

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.

interface IDefaultInterfaceMethod
{
    public void DefaultMethod()
    {
       Console.WriteLine("I am a default method in the interface!");
    }
}
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? :)

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.

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.

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

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1