mehrere klassen extenden

Status
Nicht offen für weitere Antworten.

Loki

Aktives Mitglied
Wenn du mit "extenden" erweitern meinst, dann seih hier gesagt, in Java gibts nur Einfachvererbung. Wenn du mehr willst, dann bitte über Interface.
 

Ebenius

Top Contributor
Geht nicht. In Java gibt's keine Mehrfachvererbung. Jede Klasse (außer Object) erbt von genau einer Klasse direkt, kann aber beliebig viele Schnitstellen implementieren.
Code:
class MyPanel extends javax.swing.JPanel implements java.io.Serializable, java.awt.ActionListener {
  // ...
}

Ebenius
 

SvenK

Aktives Mitglied
noisebreath hat gesagt.:
Nicht wenn man verstanden hat, wieso das so gehandhabt wird. ;)


Schau dir mal ein C++-Programm mit Mehrfachvererbung an, da weisst du nich mehr wo hinten und vorne ist. Mehrfachvererbung kann seine Vorzüge haben, aber die wenigsten setzen sie diskret ein, sondern wenn schon, denn schon .... und am Ende weisst du nicht mehr, von wo welche Methode ererbt wurde

Außerdem sind Interfaces das beste, was der Menschheit seit Erfindung des automatischen Rückenkratzers passiert ist ....
 

ARadauer

Top Contributor
Vererbung wird überschätzt! Komposition und Aggregation ist oft besser.

Warum sollte mein Datencontainer eine Liste sein, wenn er eine Liste enthalten kann und das Interface einer Liste nach aussen implementieren kann. 10 Stufige Verbungshirachien wo in jeder Stufe mal eine Methode überschrieben wurde sind nicht garde lustig zu debuggen....
 

Murray

Top Contributor
noisebreath hat gesagt.:
wie isn die syntax wenn ich mehrere dinge extenden will?

bla extends bla1 und bla 2

Nur der Vollständigkeit halber: Interfaces können durchaus mehrere andere Interfaces beerben; die Syntax ist dann
Code:
public interface Bla extends Bla1, Bla2 {
}
 

Marco13

Top Contributor
Wie wär's: Ich schreib' dir ein (nicht-obfuskiertes) C++-Programm mit 20 Zeilen, bestehend aus 2-3 Klassen, wo effektiv nur "eine" Methode aufgerufen wird, und du wirst mir aus dem stegreif NICHT sagen können, welche Methode das ist, die da aufegrufen wird. Mit Java ist das schon schwieriger.
 

Marco13

Top Contributor
Huii, dass da so viele so draufhüpfen... Na gut, trotz der Problematik, dass man oft schon an der Fragestellung die Antwort ablesen kann, hier das kleine Quiz:
Code:
#include <iostream>
using namespace std;

class A
{
      public : virtual void f() {  cout << "A" << endl;  };
};

class B : virtual public A 
{
      public : virtual void f() { cout << "B" << endl;  };
};

class C : virtual public A {};

class BC : public B, public C {};

int main()
{
    BC bc;
    C* c = & bc;
    c->f();
    system("PAUSE");
    return 0;
}
Ist die Ausgabe A, B oder läßt es sich aufgrund von Mehrdeutigkeit nicht compilieren?


EDIT: Da stand ursprünglich was fehlerhaftes, durch das & .... Jetzt müßt's stimmen...
 

Landei

Top Contributor
Es sei darauf hingewiesen, dass man in Java über Reflection (genauer gesagt über dynamic proxy) auch so eine Art Mehrfachvererbung realisieren kann, aber das ist etwas für sehr, sehr kranke Geister.

Mehrfachvererbung gibt es übrigens auch in einer "sauberen" Variante, der sogenannten Mixin-Vererbung (ich brauche sicher nicht zu betonen, welche auf der JVM laufende Sprache sowas hat)
 

Zed

Bekanntes Mitglied
Mein Tip ist:
Du speicherst in c die Adresse von der Klasse BC. Der Pointer c ist aber von Typ C welcher die Klasse C representiert und C erbt nur von A so wird denke ich die Funktion f() von A aufgerufen. Aber zu 100% sicher bin ich mir da nicht.
 

Ebenius

Top Contributor
Zed's Begründung glaub ich nicht. Die Vererbung ist rein virtuell. Ich gehe davon aus, dass es wegen Mehrdeutigkeit nicht kompiliert.
 

Ariol

Top Contributor
Ich denke das B.f() aufgerufen wird.

Das erstellte Objekt bc ist vom Typ BC, welches zuerst B erbt:
bc.f() ruft also B.f() auf.

Durch das Erstellen eine C-Pointers aus bc wird ja nur die Adresse übergeben. Da sowohl A als auch B und C die Funktion f() besitzen ist der Aufruf von c->f() kein Problem -> Da aber in Wirklichkeit ein BC-Objekt dahinter steckt wird BC.f() aufgerufen, was wiederum B.f() aufruft.

Ist das so richtig?
 

Landei

Top Contributor
Pseudomehrfachvererbung in Java (für sehr, sehr kranke Gemüter)

Erst Mal ein paar Interfaces und Klassen:
Code:
public interface Cat {
   public void purr();
}

public interface Dog {
   public void bark();
}

public class Angora implements Cat {
    public void purr() {
        System.out.println("purrrrrr");
    }
}

public class Beagle implements Dog {
    public void bark() {
        System.out.println("wuff");
    }
}

Und jetzt die Gentechnik:
Code:
public class BioLab {

   public static Object breed(final Object... args) {
       Set<Class> interfaces = new HashSet<Class>();
       for(Object o : args) {
           for(Class<?> interf : o.getClass().getInterfaces()) {
               interfaces.add(interf);
           }
       }
       return Proxy.newProxyInstance(BioLab.class.getClassLoader(), interfaces.toArray(new Class[0]),
        new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable {
                if (arguments == null) {
                    arguments = new Object[0];
                }
                for(Object o : args) {
                    for(Method m: o.getClass().getMethods()) {
                        if (m.getName().equals(method.getName())) {
                            Class[] classes = m.getParameterTypes();
                            if (classes.length == arguments.length) {
                                boolean match = true;
                                for(int i = 0; i < arguments.length; i++) {
                                    if (! classes[i].isAssignableFrom(arguments[i].getClass())) {
                                        match = false;
                                        break;
                                    }
                                }
                                if (match) {
                                   return m.invoke(o, arguments);
                                }
                            }
                        }
                    }
                }
                return null;
            }
       });
   }

   //for testing
   public static void main(String... args) {
       Object chimaira = breed(new Beagle(), new Angora());
       System.out.println(chimaira instanceof Dog);
       System.out.println(chimaira instanceof Cat);
       ((Dog)chimaira).bark();   
       ((Cat)chimaira).purr();
   }

}

WARNUNG: Solche Konstruktionen sind gemeingefährlich (z.B. ruft der Code einfach die erste "passende" Methode auf) und sollten nicht in freier Wildbahn verwendet werden.
 

Zed

Bekanntes Mitglied
Ich hab mal das kleine C++ Programm laufen lassen und es wird immer B aufgerufen. Hätte ich nicht gedacht
 

Marco13

Top Contributor
Jupp, es wird B ausgegeben. Eine genaue Begründung traue ich mir nicht zu (nur ein paar Arumentationsbrocken). Das überlasse ich den C++-Experten.

Ein Aspekt, den ich daran kritisch finde, ist, dass das engültige Verhalten vom Vorhandensein oder nicht-Vorhandensein des Schlüsselworts "virtual" an der einen oder anderen Stelle abhängt (auch innerhalb schon "Schwesterklassen"). Es ist einfach unübersichtlich und schwer nachvollziehbar.
 
M

maki

Gast
Jupp, es wird B ausgegeben. Eine genaue Begründung traue ich mir nicht zu (nur ein paar Arumentationsbrocken). Das überlasse ich den C++-Experten.
Bin kein C++ Experte, meine aber mich erinnern zu können das der Kompiler festlegt, wie die Aufrufe aufgelöst werden können, und zwar anhand der Reihenfolge der vererbenden Klassen.

Möchte mal jemand testen was passiert wenn anstatt
Code:
class BC : public B, public C {};
die Reihenfolge umgedreht wird:
Code:
class BC : public C, public B {};

Jedenfalls sind solche "Regeln" die nirgendwo klar definiert sind nicht gerade ein Garant für guten Quellcode der verständlich ist.
 

Zed

Bekanntes Mitglied
Mann muss aber schon zugeben das man das Problem umgehen kann durch eine konkrete Bezeichung bei Methoden.
Wer eine Mehrfachvererbung nutzt und Methoden gleich benennt ist selber schuld wenn er erst debuggen muss um den Fehler zu finden.
 

didjitalist

Bekanntes Mitglied
genau das ist einer der gründe, warum java keine mehrfachvererbung bietet. alles ist wunderbar, solange man sich nur in seinem eigenen code bewegt. aber lass mal mehrere leute am selbe code rumfuhrwerken. wenn die nicht höllisch aufpassen, gibs irgendwann ne klassenhierarchie, da kannst dir hände und füsse dran wärmen.
 
M

maki

Gast
Zed hat gesagt.:
Mann muss aber schon zugeben das man das Problem umgehen kann durch eine konkrete Bezeichung bei Methoden.
Wer eine Mehrfachvererbung nutzt und Methoden gleich benennt ist selber schuld wenn er erst debuggen muss um den Fehler zu finden.
Bedenkst du dabei auch dass es Methoden gibt die jedes Objekt immer anbietet wie equals, hashcode, toString etc. pp.? :wink:

Kurzum: Die Mehrfachvererbung in C++ ist nicht gerade durchdacht (wie viele andere Dinge in C++ auch), nicht umsonst hat schon M$ in VC++ die Mehrfachableitung von CObject verboten.
 

_fliX

Mitglied
Hallo,

ich habe gerade mal einen Test gemacht, bezüglich Vererbung. Es wird ja gesagt, dass es keine richtige Mehrfachvererbung gibt. Was ist das denn wenn ich folgendes Beispiel habe:

Es gibt die klassen A,B,C
B erbt von A und C erbt von B

Trotzdem kann ich doch in der Klasse C Dinge der Klasse A aufrufen. Genauso wird auch der Konstruktor von A und B ausgeführt, wenn ich ein Objekt der Klasse C instanziiere.

Ist das keine Mehrfachverberung? Was genau soll dann Einfachverberung bedeuten?
 

faetzminator

Gesperrter Benutzer
Möchte mal jemand testen was passiert wenn anstatt
Code:
class BC : public B, public C {};
die Reihenfolge umgedreht wird:
Code:
class BC : public C, public B {};

und was wär wenn das funktionieren würde? Wie könnte ich dann aus BC explizit B aufrufen wollen würde? super<B>.doSomething() oder was :D ?
 

Paddelpirat

Bekanntes Mitglied
@_flix
In dem Fall:
Es gibt die klassen A,B,C
B erbt von A und C erbt von B

kannst du z.B. annehmen du hast eine Methode doSomething() in der Klasse A
Nun sagst du das B von A erbt. Dann hast du die zwei Möglichkeiten, dass B die Methode doSomething() überschreibt, oder sie so lässt wie sie in A definiert wurde.

In der klasse C, die von B erbt, ist es nun so dass die Methode doSomething() halt die ursprüngliche Form hat (wenn du sie nicht in B überschireben hast), oder sie so aussieht wie du sie in B überschrieben hast.

Aber du hast z.B. nicht das Problem, wie es Marco13 in seinem C++ Programm gezeigt hast. Du kannst sofort anhand des Quellcodes entscheiden, ob die Methode doSomething() das macht was sie in A macht, oder das was sie in B macht.
 

faetzminator

Gesperrter Benutzer
Das ist bei Einfachvererbung durchaus so, aber wie sieht das bei mehrfachvererbung aus? Ich weiss, dass dies z.B. in Python möglich ist, und grundsätzlich die Methode der erstdefinierten Klasse verwendet wird. Aber kann man dort explizit auf eine Methode der zweitdefinierten Klasse verwenden? Als Beispiel: B erbt von A1 und A2, ich habe in beiden Klassen foo(String) und bar(int), ich will nun foo() von A1 und bar() von A2 verwenden - was dann?
 

_fliX

Mitglied
@_flix
In dem Fall:
Es gibt die klassen A,B,C
B erbt von A und C erbt von B

kannst du z.B. annehmen du hast eine Methode doSomething() in der Klasse A
Nun sagst du das B von A erbt. Dann hast du die zwei Möglichkeiten, dass B die Methode doSomething() überschreibt, oder sie so lässt wie sie in A definiert wurde.

In der klasse C, die von B erbt, ist es nun so dass die Methode doSomething() halt die ursprüngliche Form hat (wenn du sie nicht in B überschireben hast), oder sie so aussieht wie du sie in B überschrieben hast.

Aber du hast z.B. nicht das Problem, wie es Marco13 in seinem C++ Programm gezeigt hast. Du kannst sofort anhand des Quellcodes entscheiden, ob die Methode doSomething() das macht was sie in A macht, oder das was sie in B macht.

kann man das so festhalten, das jeweils immer die letzte "gültige" methode/attribut benutzt wird?
 

Leroy42

Top Contributor
Also als Fazit dessen Allem:

Mehrfachvererbung resultiert in einen grossen Haufen Scheisse! :shock:

(Deswegen gibts also solche Probleme mit gewissen Säugetieren und ähnlichem! :D)
 

SchonWiederFred

Bekanntes Mitglied
Das erstellte Objekt bc ist vom Typ BC, welches zuerst B erbt:
Die "Vererbungsreihenfolge" spielt keine Rolle.
C++ Standard §10.1 (2) hat gesagt.:
the order of derivation is not significant except as specified by the semantics of initialization by constructor (12.6.2), cleanup (12.4), and storage layout (9.2, 11.1).
Das gezeigte Programmfragment ist ein Puzzle. Puzzles gibt es in jeder Sprache, aber niemand würde sowas wirklich schreiben und einsetzen.
 

SchonWiederFred

Bekanntes Mitglied
Als Beispiel: B erbt von A1 und A2, ich habe in beiden Klassen foo(String) und bar(int), ich will nun foo() von A1 und bar() von A2 verwenden - was dann?
Code:
#include <iostream>
#include <string>

struct A1
{
    virtual void foo(std::string const& str)
    {
        std::cout << "foo in A1\n";
    }

    virtual void bar(int x)
    {
        std::cout << "bar in A1\n";
    }
};

struct A2
{
    virtual void foo(std::string const& str)
    {
        std::cout << "foo in A2\n";
    }

    virtual void bar(int x)
    {
        std::cout << "bar in A2\n";
    }
};

struct B : A1, A2
{
};

int main()
{
    B b;
    b.A1::foo("hello");
    b.A2::bar(42);
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
W Variablenübergabe über mehrere Klassen Allgemeine Java-Themen 4
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
S Tool um mehrere Klassen in einer Klasse vereinen? Allgemeine Java-Themen 6
S log4j Logging über mehrere Klassen Allgemeine Java-Themen 13
P mehrere super klassen Allgemeine Java-Themen 10
C Mehrere main-Klassen in JAR Allgemeine Java-Themen 2
C mehrere Java Klassen in einer Datei Allgemeine Java-Themen 4
berserkerdq2 Ist es schlechter Programmierstyle mehrere Panes aufeinander zu machen? Allgemeine Java-Themen 1
Tarrew OpenAPI Schnittstelle - Mehrere Kunden mit unterschiedlichen Zugriffsrechten Allgemeine Java-Themen 2
A Mehrere for-Schleifen Allgemeine Java-Themen 2
M Mehrere Sounds Allgemeine Java-Themen 3
M Mehrere Ressourcen in einem package ablegen Allgemeine Java-Themen 1
Avalon DTO aus mehrere Entitäten erstellen Allgemeine Java-Themen 5
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
bueseb84 Git : Mehrere Server verwenden Allgemeine Java-Themen 3
L Mehrere .Jar Files aufrufen Allgemeine Java-Themen 9
L mehrere Methoden Allgemeine Java-Themen 19
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
T String mehrere Worte Allgemeine Java-Themen 2
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
S libGDX mehrere Texturen zu Einer zusammenfassen Allgemeine Java-Themen 0
X Mehrere booleans in Datei Speichern, Updaten und Laden Allgemeine Java-Themen 1
OnDemand CSV parsen mehrere Zeilen Allgemeine Java-Themen 22
K Mehrere Programmiersprachen gleichzeitig lernen Allgemeine Java-Themen 3
C Mehrere Seiten drucken in Hoch- und Querformat Allgemeine Java-Themen 0
perlenfischer1984 Mehrere Komponenten erstellen Allgemeine Java-Themen 3
F AWT Mehrere Tastatureingaben verarbeiten Allgemeine Java-Themen 5
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7
HarleyDavidson Best Practice Integer-Zahlenfolge über mehrere Programmstarts Allgemeine Java-Themen 7
F Mehrere JTables' drucken Allgemeine Java-Themen 0
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
stylegangsta Mehrere html seiten einer Homepage einlesen und als Textdatei ausgeben Allgemeine Java-Themen 14
P Mehrere Java Versionen auf dem Rechner Allgemeine Java-Themen 3
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
S PrintWriter.println() schreibt mehrere Zeilen Allgemeine Java-Themen 19
2 Mehrere Uhrzeiten Sortieren Allgemeine Java-Themen 2
T Jsoup: Mehrere Links nacheinander parsen Allgemeine Java-Themen 11
E Lesen von mehrere Csv-Datei und ihre Inhalte vergleichen Allgemeine Java-Themen 3
K GUI-Entwicklung - Dispose, enabling und mehrere Controller Allgemeine Java-Themen 1
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
H Mehrere Bilder aus einer Datei lesen Allgemeine Java-Themen 2
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
K Mehrere Arrays auf einmal erstellen Allgemeine Java-Themen 2
R ListIterator über mehrere Arrays Allgemeine Java-Themen 13
J JFreeChart - Mehrere X-Achsen Einteilungen Allgemeine Java-Themen 3
S Mehrere Shapes "malen" Allgemeine Java-Themen 3
M Input/Output Mehrere Bilder aus Resourcen auslesen Allgemeine Java-Themen 8
J Erste Schritte Mehrere Mauszeiger für Ping Pong Game Allgemeine Java-Themen 7
P Mehrere MP3s abspielen Allgemeine Java-Themen 3
M Mehrere CRLF entfernen Allgemeine Java-Themen 13
F Mehrere Threads - ein Stack Allgemeine Java-Themen 6
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
B JUnit und mehrere Instanzen der selben Applikation Allgemeine Java-Themen 4
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
A Email versenden mehrere Zeilen Allgemeine Java-Themen 10
D Mehrere String-Werte in eine Tabellen-Zelle schreiben Allgemeine Java-Themen 8
R JTree - Mehrere Roots Allgemeine Java-Themen 6
Beckenbauer Mehrere Paragraphe in eine Word Datei schreiben Allgemeine Java-Themen 4
H Mehrere Anwendungen von Java kontrollieren lassen Allgemeine Java-Themen 10
T Edit: JLabel+MouseListener oeffnet mehrere Instanzen Allgemeine Java-Themen 5
O split mit einem ODER mehrere Tabulatoren oder Leerzeichen Allgemeine Java-Themen 6
M JFreeChart mehrere PieCharts erstellen Allgemeine Java-Themen 2
S Wie kann ein Observer mehrere Observables beobachten? Allgemeine Java-Themen 9
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
B mehrere services in einem client Allgemeine Java-Themen 10
Meldanor Speichern der Datenbank - Lohnen sich mehrere Threads? Allgemeine Java-Themen 2
G Process - mehrere Commands?! Allgemeine Java-Themen 2
O Mehrere Exemplare(Kopieen) drucken Allgemeine Java-Themen 2
F 1 Key - mehrere Values Allgemeine Java-Themen 3
G JOGL mehrere GLCanvas erstellen Allgemeine Java-Themen 2
S Mehrere Listen ineinander verschachteln Allgemeine Java-Themen 22
P Java3D mehrere Ebenen parallel zu yz-Ebene Allgemeine Java-Themen 9
R mehrere jar Dateien kompinieren Allgemeine Java-Themen 14
P Mehrere Instanzen der selben Appl. verhindern Allgemeine Java-Themen 12
M Scanner-Methode: Mehrere Eingaben mit Exception behandeln Allgemeine Java-Themen 10
I Wie kann ich mehrere Mp3 Tags ausgeben? Allgemeine Java-Themen 6
I Mehrere MP3 Dateien einlesen? Allgemeine Java-Themen 3
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
C ArrayList sortieren (mehrere Kriterien) Allgemeine Java-Themen 6
G Oracle will mehrere hundert Produkte patchen Allgemeine Java-Themen 5
F Logger in mehrere Dateien mit log4J Allgemeine Java-Themen 4
W Properties-Klasse: mehrere Parameter-Belegungen übergeben? Allgemeine Java-Themen 2
Daniel_L Mehrere (XML-)Datei aus einer ZIP-Datei auslesen Allgemeine Java-Themen 4
V Mehrere main() in jar, wie starten? Allgemeine Java-Themen 4
A Problem: Mehrere PDF-Files nacheinander Öffnen Allgemeine Java-Themen 12
D Mit Linux mehrere Kommandos in einem Subprozeß Allgemeine Java-Themen 3
D Suche sowas wie Map nur für mehrere Werte Allgemeine Java-Themen 13
V JFilechooser, mehrere Datein selektieren und Reihenfolge? Allgemeine Java-Themen 2
G mehrere Threads verwalten? Allgemeine Java-Themen 14
K Applet dass auf mehrere Bibliotheken zugreift Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben