Warum ist Mehrfachvererbung in Java oder C # nicht zulässig?


115

Ich weiß, dass Mehrfachvererbung in Java und C # nicht zulässig ist. Viele Bücher sagen nur, Mehrfachvererbung ist nicht erlaubt. Es kann jedoch mithilfe von Schnittstellen implementiert werden. Es wird nichts darüber diskutiert, warum es nicht erlaubt ist. Kann mir jemand genau sagen, warum es nicht erlaubt ist?


1
Genau wie darauf hinweisen , dass es sind Rahmenbedingungen gibt , die erlauben MI-ähnliches Verhalten in C # -Klassen. Und natürlich haben Sie die Möglichkeit, zustandslose Mixins (mit Erweiterungsmethoden) zu verwenden - da sie zustandslos sind, sind sie jedoch nicht sehr nützlich.
Dmitri Nesteruk

1
Dass Schnittstellen etwas mit Vererbung zu tun haben, ist eine Illusion, die durch die Sprachsyntax erzeugt wird. Vererbung soll dich reicher machen. Nichts dergleichen für eine Schnittstelle, Sie erben keine Kniebeugen und es macht Sie deutlich ärmer. Sie haben Onkel Harrys Spielschulden geerbt, Sie haben mehr Arbeit zu tun, um die Schnittstelle zu implementieren.
Hans Passant

Antworten:


143

Die kurze Antwort lautet: Weil sich die Sprachdesigner dagegen entschieden haben.

Grundsätzlich schien es, dass sowohl die .NET- als auch die Java-Designer keine Mehrfachvererbung zuließen, da sie der Ansicht waren, dass das Hinzufügen von MI den Sprachen zu viel Komplexität hinzufügte und gleichzeitig zu wenig Nutzen brachte .

Für eine unterhaltsamere und ausführlichere Lektüre stehen im Internet einige Artikel mit Interviews einiger Sprachdesigner zur Verfügung. Für .NET hat beispielsweise Chris Brumme (der bei MS an der CLR gearbeitet hat) die Gründe erläutert, warum er sich entschieden hat, dies nicht zu tun:

  1. Verschiedene Sprachen haben tatsächlich unterschiedliche Erwartungen an die Funktionsweise von MI. Zum Beispiel, wie Konflikte gelöst werden und ob doppelte Basen zusammengeführt oder redundant sind. Bevor wir MI in der CLR implementieren können, müssen wir alle Sprachen untersuchen, die gemeinsamen Konzepte herausfinden und entscheiden, wie sie sprachneutral ausgedrückt werden sollen. Wir müssten auch entscheiden, ob MI in das CLS gehört und was dies für Sprachen bedeuten würde, die dieses Konzept nicht wollen (vermutlich VB.NET zum Beispiel). Das ist natürlich das Geschäft, in dem wir uns als gemeinsame Sprachlaufzeit befinden, aber wir sind noch nicht dazu gekommen, es für MI zu tun.

  2. Die Anzahl der Orte, an denen MI wirklich angemessen ist, ist eigentlich recht gering. In vielen Fällen kann die Vererbung mehrerer Schnittstellen stattdessen die Aufgabe erledigen. In anderen Fällen können Sie möglicherweise die Kapselung und Delegierung verwenden. Wenn wir ein etwas anderes Konstrukt wie Mixins hinzufügen würden, wäre das tatsächlich mächtiger?

  3. Die Vererbung mehrerer Implementierungen bringt viel Komplexität in die Implementierung. Diese Komplexität wirkt sich auf Casting, Layout, Versand, Feldzugriff, Serialisierung, Identitätsvergleiche, Überprüfbarkeit, Reflexion, Generika und wahrscheinlich viele andere Orte aus.

Den vollständigen Artikel können Sie hier lesen.

Für Java können Sie lesen diesen Artikel :

Die Gründe für das Weglassen der Mehrfachvererbung aus der Java-Sprache liegen hauptsächlich im Ziel "einfach, objektorientiert und vertraut". Als einfache Sprache wollten die Entwickler von Java eine Sprache, die die meisten Entwickler ohne umfassende Schulung verstehen können. Zu diesem Zweck haben sie daran gearbeitet, die Sprache C ++ so ähnlich wie möglich (vertraut) zu machen, ohne die unnötige Komplexität von C ++ (einfach) zu übernehmen.

Nach Meinung der Designer verursacht Mehrfachvererbung mehr Probleme und Verwirrung als sie löst. Sie reduzieren also die Mehrfachvererbung aus der Sprache (genau wie sie die Überladung von Operatoren reduzieren). Die umfangreiche C ++ - Erfahrung der Designer lehrte sie, dass Mehrfachvererbung die Kopfschmerzen einfach nicht wert war.


10
Schöner Vergleich. Sehr bezeichnend für die Denkprozesse, die beiden Plattformen zugrunde liegen, denke ich.
CurtainDog

97

Eine mehrfache Vererbung der Implementierung ist nicht zulässig.

Das Problem ist, dass der Compiler / die Laufzeit nicht herausfinden kann, was zu tun ist, wenn Sie eine Cowboy- und eine Artist-Klasse haben, beide mit Implementierungen für die draw () -Methode, und dann versuchen, einen neuen CowboyArtist-Typ zu erstellen. Was passiert, wenn Sie die draw () -Methode aufrufen? Liegt jemand tot auf der Straße oder hast du ein schönes Aquarell?

Ich glaube, es heißt das Problem der doppelten Diamantvererbung.


80
Du bekommst ein schönes Aquarell von jemandem, der tot auf der Straße ist :-)
Dan F

Ist das das einzige Problem? Ich bin mir nicht sicher, ob C ++ dieses Problem durch das virtuelle Schlüsselwort löst. Ist das wahr? Ich bin nicht gut in C ++
Abdulsattar Mohammed

2
In C ++ können Sie entweder angeben, welche der Basisklassenfunktionen abgeleitet werden soll, oder sie selbst neu implementieren.
Dmitry Risenberg

1
Modernes Design tendiert in allen außer den einfachsten Fällen dazu, Komposition gegenüber Vererbung zu bevorzugen. Mehrfachvererbung hätte niemals als einfacher Fall gezählt. Mit der Komposition haben Sie eine genaue Kontrolle darüber, was Ihre Klasse tut, wenn es Diamantprobleme wie dieses gibt ...
Bill Michell

Sie brauchen einfach eine Prioritätenliste. Dies wird im Common Lisp-Objektsystem CLOS verwendet. Alle Klassen bilden eine Erbschaft und die Methode, die aufgerufen wird, wird von dort bestimmt. Außerdem können Sie mit CLOS verschiedene Regeln definieren, sodass ein CowboyArtist.draw () zuerst einen Cowboy und dann einen Künstler zeichnen kann. Oder was auch immer du erfindest.
Sebastian Krog

19

Grund: Java ist aufgrund seiner Einfachheit sehr beliebt und einfach zu codieren.

Was auch immer Java-Entwickler für Programmierer schwierig und kompliziert zu verstehen fühlen, sie haben versucht, dies zu vermeiden. Eine solche Art von Eigenschaft ist die Mehrfachvererbung.

  1. Sie vermieden Zeiger
  2. Sie vermieden Mehrfachvererbung.

Problem mit Mehrfachvererbung: Diamantproblem.

Beispiel :

  1. Angenommen, Klasse A hat eine Methode fun (). Klasse B und Klasse C stammen aus Klasse A.
  2. Und beide Klassen B und C überschreiben die Methode fun ().
  3. Nehmen wir nun an, dass Klasse D sowohl Klasse B als auch C erbt (nur Annahme)
  4. Objekt für Klasse D erstellen.
  5. D d = neues D ();
  6. und versuchen Sie, auf d.fun () zuzugreifen; => Wird es den Spaß der Klasse B () oder den Spaß der Klasse C () nennen?

Dies ist die Mehrdeutigkeit, die im Diamantproblem besteht.

Es ist nicht unmöglich, dieses Problem zu lösen, aber es schafft mehr Verwirrung und Komplexität für den Programmierer beim Lesen. Es verursacht mehr Probleme als es zu lösen versucht.

Hinweis : Auf jeden Fall können Sie die Mehrfachvererbung jederzeit indirekt über Schnittstellen implementieren.


1
"Aber auf jede Weise können Sie immer mehrere Vererbungen indirekt über Schnittstellen implementieren." - Der Programmierer muss den Hauptteil der Methoden jedes Mal neu angeben.
Kari

13

Weil Java eine ganz andere Designphilosophie hat als C ++. (Ich werde hier nicht über C # sprechen.)

Beim Entwerfen von C ++ wollte Stroustrup nützliche Funktionen einbeziehen, unabhängig davon, wie sie missbraucht werden könnten. Es ist möglich, mit Mehrfachvererbung, Überladung von Bedienern, Vorlagen und verschiedenen anderen Funktionen große Probleme zu haben, aber es ist auch möglich, einige sehr gute Dinge damit zu tun.

Die Java-Designphilosophie besteht darin, die Sicherheit in Sprachkonstrukten zu betonen. Das Ergebnis ist, dass es Dinge gibt, die viel umständlicher zu tun sind, aber Sie können viel sicherer sein, dass der Code, den Sie betrachten, genau das bedeutet, was Sie denken, dass er tut.

Darüber hinaus war Java weitgehend eine Reaktion von C ++ und Smalltalk, den bekanntesten OO-Sprachen. Es gibt viele andere OO-Sprachen (Common Lisp war tatsächlich die erste, die standardisiert wurde), mit verschiedenen OO-Systemen, die MI besser handhaben.

Ganz zu schweigen davon, dass es durchaus möglich ist, MI in Java mithilfe von Schnittstellen, Komposition und Delegierung durchzuführen. Es ist expliziter als in C ++ und daher umständlicher zu verwenden, bietet Ihnen jedoch etwas, das Sie auf den ersten Blick eher verstehen.

Hier gibt es keine richtige Antwort. Es gibt verschiedene Antworten, und welche für eine bestimmte Situation besser ist, hängt von den Anwendungen und den individuellen Vorlieben ab.


12

Der Hauptgrund (obwohl keineswegs der einzige), warum Menschen sich von MI abwenden, ist das sogenannte "Diamantproblem", das zu Unklarheiten bei Ihrer Implementierung führt. Dieser Wikipedia-Artikel beschreibt es und erklärt es besser als ich. MI kann auch zu komplexerem Code führen, und viele OO-Designer behaupten, dass Sie MI nicht benötigen, und wenn Sie es verwenden, ist Ihr Modell wahrscheinlich falsch. Ich bin mir nicht sicher, ob ich diesem letzten Punkt zustimme, aber es ist immer ein guter Plan, die Dinge einfach zu halten.


8

In C ++ war die Mehrfachvererbung bei unsachgemäßer Verwendung ein großes Problem. Um diese beliebten Designprobleme zu vermeiden, wurde stattdessen in modernen Sprachen (Java, C #) die Vererbung mehrerer Schnittstellen erzwungen.


8

Mehrfachvererbung ist

  • schwer zu verstehen
  • schwer zu debuggen (wenn Sie beispielsweise Klassen aus mehreren Frameworks mit identischen Methoden mischen, können ganz unerwartete Synergien auftreten)
  • leicht zu missbrauchen
  • nicht wirklich das nützlich
  • schwer zu implementieren, besonders wenn Sie es richtig und effizient machen wollen

Daher kann es eine kluge Wahl sein berücksichtigt nicht die Mehrfachvererbung in die Java - Sprache enthalten.


3
Ich bin mit all dem nicht einverstanden, da ich mit dem Common Lisp Object System gearbeitet habe.
David Thornley

2
Dynamische Sprachen zählen nicht ;-) In jedem Lisp-ähnlichen System gibt es eine REPL, die das Debuggen ziemlich einfach macht. Außerdem ist CLOS (so wie ich es verstehe, habe ich es nie wirklich benutzt, nur darüber gelesen) ein Meta-Objekt-System mit viel Flexibilität und einer eigenen Einstellung. Betrachten Sie jedoch eine statisch kompilierte Sprache wie C ++, in der der Compiler mithilfe mehrerer (möglicherweise überlappender) vtables eine teuflisch komplexe Methodensuche generiert: In einer solchen Implementierung ist es möglicherweise nicht so trivial, herauszufinden, welche Implementierung einer Methode aufgerufen wurde.
mfx

5

Ein weiterer Grund ist, dass die Einzelvererbung das Casting trivial macht und keine Assembler-Anweisungen ausgibt (außer bei Bedarf die Kompatibilität der Typen zu überprüfen). Wenn Sie mehrfach vererbt wurden, müssen Sie herausfinden, wo in der untergeordneten Klasse ein bestimmter Elternteil beginnt. Leistung ist also sicherlich ein Vorteil (obwohl nicht der einzige).


4

In den alten Tagen (70er Jahre), als Informatik mehr Wissenschaft und weniger Massenproduktion war, hatten die Programmierer Zeit, über gutes Design und gute Implementierung nachzudenken, und als Ergebnis hatten die Produkte (Programme) eine hohe Qualität (z. B. TCP / IP-Design) und Umsetzung). Heutzutage, wenn alle programmieren und die Manager die Spezifikationen vor Ablauf der Fristen ändern, sind subtile Probleme, wie sie im Wikipedia-Link von Steve Haigh beschrieben sind, schwer zu verfolgen. Daher ist die "Mehrfachvererbung" durch das Compiler-Design begrenzt. Wenn es dir gefällt, kannst du immer noch C ++ verwenden ... und hast alle Freiheiten, die du willst :)


4
... einschließlich der Freiheit, sich mehrmals in den Fuß zu schießen;)
Mario Ortegón

4

Ich nehme die Aussage, dass "Mehrfachvererbung in Java nicht erlaubt ist" mit einer Prise Salz.

Mehrfachvererbung wird definiert, wenn ein "Typ" von mehr als einem "Typ" erbt. Und Schnittstellen werden aufgrund ihres Verhaltens auch als Typen klassifiziert. Java hat also eine Mehrfachvererbung. Nur dass es sicherer ist.


6
Sie erben jedoch nicht von einer Schnittstelle, sondern implementieren sie. Schnittstellen sind keine Klassen.
Blorgbeard ist am

2
Ja, aber die Vererbung war nie so eng definiert, außer in einigen vorläufigen Büchern. Und ich denke, wir sollten über die Grammatik hinausschauen. Beide machen dasselbe und Schnittstellen wurden nur aus diesem Grund "erfunden".
Rig Veda

Nehmen Sie die Schnittstelle Closeable: eine Methode, close (). Angenommen, Sie möchten dies auf Openable erweitern: Es gibt eine Methode open (), die ein boolesches Feld isOpen auf true setzt. Der Versuch, ein bereits geöffnetes Openable zu öffnen, löst eine Ausnahme aus, ebenso wie der Versuch, ein nicht geöffnetes Openable zu schließen ... Hunderte interessanterer Genealogie von Klassen möchten möglicherweise solche Funktionen übernehmen ... ohne sich dafür entscheiden zu müssen, jedes zu erweitern Zeit ab Klasse Öffnen. Wenn Openable lediglich eine Schnittstelle wäre, könnte es diese Funktionalität nicht bereitstellen. QED: Schnittstellen bieten keine Vererbung!
Mike Nagetier

4

Das dynamische Laden von Klassen erschwert die Implementierung der Mehrfachvererbung.

In Java haben sie die Komplexität der Mehrfachvererbung vermieden, indem sie stattdessen eine Einzelvererbung und eine Schnittstelle verwendet haben. Die Komplexität der Mehrfachvererbung ist in einer Situation wie unten erläutert sehr hoch

Diamantproblem der Mehrfachvererbung. Wir haben zwei Klassen B und C, die von A erben. Angenommen, B und C überschreiben eine geerbte Methode und stellen ihre eigene Implementierung bereit. Jetzt erbt D sowohl von B als auch von C und führt eine Mehrfachvererbung durch. D sollte diese überschriebene Methode erben, kann jvm nicht entscheiden, welche überschriebene Methode verwendet wird?

In C ++ werden virtuelle Funktionen verwendet, um zu behandeln, und wir müssen explizit tun.

Dies kann durch die Verwendung von Schnittstellen vermieden werden, es gibt keine Methodenkörper. Schnittstellen können nicht instanziiert werden - sie können nur von Klassen implementiert oder durch andere Schnittstellen erweitert werden.


3

Tatsächlich entsteht eine Mehrfachvererbung in der Komplexität, wenn die geerbten Klassen dieselbe Funktion haben. dh der Compiler wird eine Verwirrung haben, die man wählen muss (Diamantproblem). In Java wurde diese Komplexität entfernt und eine Schnittstelle bereitgestellt, um die Funktionalität zu erhalten, die eine Mehrfachvererbung bietet. Wir können Schnittstelle verwenden


2

Java hat ein Konzept, dh Polymorphismus. Es gibt zwei Arten von Polymorphismus in Java. Es gibt Methodenüberladung und Methodenüberschreibung. Unter diesen tritt das Überschreiben von Methoden bei Beziehungen zwischen Super- und Unterklassen auf. Wenn wir ein Objekt einer Unterklasse erstellen und die Methode der Oberklasse aufrufen und wenn die Unterklasse mehr als eine Klasse erweitert, welche Oberklassenmethode sollte aufgerufen werden?

Oder wird beim Aufrufen des Superklassenkonstruktors von super()welcher Superklassenkonstruktor aufgerufen?

Diese Entscheidungen sind aufgrund der aktuellen Java-API-Funktionen nicht möglich. Daher ist Mehrfachvererbung in Java nicht zulässig.


Grundsätzlich geht das Typsystem von Java davon aus, dass jede Objektinstanz einen Typ hat. Das Umwandeln eines Objekts in einen Supertyp funktioniert immer und ist referenzerhaltend, und das Umwandeln eines Verweises auf einen Subtyp ist referenzerhaltend, wenn die Instanz von diesem Subtyp oder a ist Subtyp davon. Solche Annahmen sind nützlich, und ich denke nicht, dass es möglich ist, eine verallgemeinerte Mehrfachvererbung in einer mit ihnen konsistenten Weise zuzulassen.
Supercat

1

Mehrfachvererbung ist in Java nicht direkt zulässig, aber über Schnittstellen.

Grund :

Mehrfachvererbung: stellt mehr Komplexität und Mehrdeutigkeit.

Schnittstellen: Schnittstellen sind vollständig abstrakte Klassen in Java, mit denen Sie die Struktur oder das Innenleben Ihres Programms auf einheitliche Weise von der öffentlich verfügbaren Schnittstelle abgrenzen können. Dies führt zu mehr Flexibilität und wiederverwendbarem Code sowie zu mehr Kontrolle darüber, wie Sie andere Klassen erstellen und mit ihnen interagieren.

Genauer gesagt handelt es sich um ein spezielles Konstrukt in Java mit dem zusätzlichen Merkmal, mit dem Sie eine Art Mehrfachvererbung durchführen können, dh Klassen, die auf mehr als eine Klasse übertragen werden können.

Nehmen wir ein einfaches Beispiel.

  1. Angenommen, es gibt zwei Oberklassen der Klassen A und B mit denselben Methodennamen, aber unterschiedlichen Funktionen. Durch folgenden Code mit (erweitertem) Schlüsselwort ist eine Mehrfachvererbung nicht möglich.

       public class A                               
         {
           void display()
             {
               System.out.println("Hello 'A' ");
             }
         }
    
       public class B                               
          {
            void display()
              {
                System.out.println("Hello 'B' ");
              }
          }
    
      public class C extends A, B    // which is not possible in java
        {
          public static void main(String args[])
            {
              C object = new C();
              object.display();  // Here there is confusion,which display() to call, method from A class or B class
            }
        }
  2. Über Schnittstellen mit (implementiert) Schlüsselwort ist jedoch eine Mehrfachvererbung möglich.

    interface A
        {
           // display()
        }
    
    
     interface B
        {
          //display()
        }
    
     class C implements A,B
        {
           //main()
           C object = new C();
           (A)object.display();     // call A's display
    
           (B)object.display(); //call B's display
        }
    }

0

Kann mir jemand genau sagen, warum es nicht erlaubt ist?

Sie können Antwort von dieser Dokumentation finden Link

Ein Grund, warum die Java-Programmiersprache es Ihnen nicht erlaubt, mehr als eine Klasse zu erweitern, besteht darin, die Probleme der Mehrfachvererbung des Status zu vermeiden, dh die Fähigkeit, Felder von mehreren Klassen zu erben

Wenn Mehrfachvererbung zulässig ist und Sie ein Objekt durch Instanziieren dieser Klasse erstellen, erbt dieses Objekt Felder von allen Superklassen der Klasse. Es wird zwei Probleme verursachen.

  1. Was ist, wenn Methoden oder Konstruktoren aus verschiedenen Superklassen dasselbe Feld instanziieren?

  2. Welche Methode oder welcher Konstruktor hat Vorrang?

Obwohl die mehrfache Vererbung von Status jetzt zulässig ist, können Sie sie dennoch implementieren

Mehrfachvererbung vom Typ : Fähigkeit einer Klasse, mehr als eine Schnittstelle zu implementieren.

Mehrfachvererbung der Implementierung (über Standardmethoden in Schnittstellen): Möglichkeit, Methodendefinitionen von mehreren Klassen zu erben

Weitere Informationen finden Sie in dieser verwandten SE-Frage:

Mehrdeutige Mehrdeutigkeit mit Schnittstelle


0

In C ++ kann eine Klasse (direkt oder indirekt) von mehr als einer Klasse erben, was als Mehrfachvererbung bezeichnet wird .

C # und Java beschränken Klassen jedoch auf eine einzelne Vererbung, die jede Klasse von einer einzelnen übergeordneten Klasse erbt.

Die Mehrfachvererbung ist eine nützliche Methode zum Erstellen von Klassen, die Aspekte zweier unterschiedlicher Klassenhierarchien kombinieren. Dies tritt häufig auf, wenn unterschiedliche Klassenframeworks in einer einzelnen Anwendung verwendet werden.

Wenn zwei Frameworks beispielsweise ihre eigenen Basisklassen für Ausnahmen definieren, können Sie mithilfe der Mehrfachvererbung Ausnahmeklassen erstellen, die mit beiden Frameworks verwendet werden können.

Das Problem bei der Mehrfachvererbung besteht darin, dass dies zu Mehrdeutigkeiten führen kann. Das klassische Beispiel ist, wenn eine Klasse von zwei anderen Klassen erbt, von denen jede von derselben Klasse erbt:

class A {
    protected:
    bool flag;
};
class B : public A {};
class C : public A {};
class D : public B, public C {
    public:
    void setFlag( bool nflag ){
        flag = nflag; // ambiguous
    }
};

In diesem Beispiel wird das flagDatenelement durch definiert class A. Aber class Dstammt von class B und ab class C, von denen beide abgeleitet sind A, so dass im Wesentlichen zwei Kopien von flagverfügbar sind, da zwei Instanzen von Ain Dder Klassenhierarchie sind. Welches möchten Sie einstellen? Der Compiler wird sich beschweren , dass der Verweis auf flagin Dist mehrdeutig . Eine Lösung besteht darin, die Referenz explizit zu disambiguieren:

B::flag = nflag;

Ein weiterer Fix besteht darin, B und C als zu deklarieren virtual base classes bedeutet, dass nur eine Kopie von A in der Hierarchie vorhanden sein kann, wodurch Mehrdeutigkeiten beseitigt werden.

Andere Komplexitäten bestehen bei Mehrfachvererbung, z. B. die Reihenfolge, in der die Basisklassen beim Erstellen eines abgeleiteten Objekts initialisiert werden, oder die Art und Weise, wie Mitglieder versehentlich vor abgeleiteten Klassen verborgen werden können. Um diese Komplexität zu vermeiden, beschränken sich einige Sprachen auf das einfachere Einzelvererbungsmodell.

Dies vereinfacht zwar die Vererbung erheblich, schränkt jedoch auch ihre Nützlichkeit ein, da nur Klassen mit einem gemeinsamen Vorfahren Verhaltensweisen gemeinsam nutzen können. Schnittstellen verringern diese Einschränkung etwas, indem sie Klassen in verschiedenen Hierarchien erlauben, gemeinsame Schnittstellen verfügbar zu machen, selbst wenn sie nicht durch gemeinsame Nutzung von Code implementiert werden.


-1

Stellen Sie sich dieses Beispiel vor: Ich habe eine Klasse Shape1

Es hat CalcualteAreaMethode:

Class Shape1
{

 public void CalculateArea()

     {
       //
     }
}

Es gibt eine andere Klasse Shape2, die ebenfalls dieselbe Methode hat

Class Shape2
{

 public void CalculateArea()

     {

     }
}

Jetzt habe ich einen Kreis der Kinderklasse, der sowohl von Shape1 als auch von Shape2 abgeleitet ist.

public class Circle: Shape1, Shape2
{
}

Wenn ich nun ein Objekt für Circle erstelle und die Methode aufrufe, weiß das System nicht, welche Berechnungsflächenmethode aufgerufen werden soll. Beide haben die gleichen Signaturen. Der Compiler wird also verwirrt. Aus diesem Grund sind Mehrfachvererbungen nicht zulässig.

Es kann jedoch mehrere Schnittstellen geben, da Schnittstellen keine Methodendefinition haben. Auch wenn beide Schnittstellen dieselbe Methode haben, haben beide keine Implementierung und es wird immer eine Methode in der untergeordneten Klasse ausgeführt.


Sprachdesigner können explizite Methodenaufrufe wie in Interface geben. Es gibt keinen solchen Punkt! Ein weiterer Grund ist, wie wäre es mit abstrakter Klasse mit abstrakten Methoden, wie Sie das jetzt betrachten?
Nomi Ali
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.