Java Vererbung und Methoden überschreiben



  • Guten Abend,

    ich stehe gerade vor einem Problem. Ich versuche es mal vom Prinzip zu erklären wobei die Klassen die hier erwähnt werden andere sind.

    Ich habe eine Klasse "Figuren" die über öffentliche Methoden mit Objekten der Klasse "Rechteck" arbeitet. Nun möchte ich eine Klasse "FigurenErweitert" haben, die von der Klasse "Figuren" abgeleitet ist und auch die gleichen Methoden bereitstellen soll. Zudem soll es eine Klasse "RechteckErweitert" geben die von der Klasse "Rechteck" abgeleitet ist. Die Klasse "FigurenErweitert" soll dann anstatt mit den "Rechteck" Objekten mit den "RechteckErweitert" Objekten arbeiten. Da die Methoden die selben Aufgaben erfüllen sollen, möchte ich diese ungern überschreiben, da ich mir sonst das Vererben auch sparen könnte.

    Meine Frage: Wie kann ich der "FigurenErweitert" sagen, dass die Variablen in den geerbten Methoden statt vom Typ "Rechteck", nun vom Typ "RechteckErweitert" sein sollen?

    Viele Grüße


  • Mod

    Man kann in Java nur von einer Klasse erben. Multiple Vererbung kann zu Problemen führen, wenn mehrere Oberklassen Methoden mit identischen Signaturen implementieren oder Attribute mit identischem Namen haben.

    Was man machen kann ist die Nutzung von Interfaces. Du könntest die Methoden, die Du in einer der Superklassen definieren möchtest, erstmal nur völlig abstrakt in dem Interface definieren. Und dann kann die Klasse "FigurenErweitert" eben von einer Klasse erben und zusätzlich noch ein Interface implementieren.

    Unter Umständen könnte es auch sinnvoll sein, die Vererbungshierarchie noch in anderer Weise zu überdenken. Aber um hier etwas zu sagen, müsstest Du mehr Kontext liefern.



  • Hi,

    Ich denke, dass Geregor dich falsch verstanden hat.

    Wenn ich dich hingegen richtig verstanden habe, schaut deine Klassenstruktur so aus:

    public class Figuren
    {
        public void doSomethingWithRechteck(Rechteck rechteck)
        {
            rechteck.doSomething();
        }
    }
    
    public class Rechteck
    {
        public void doSomething()
        {
        }
    }
    
    public class FigurenErweitert
    {
        public void doSomethingWithRechteckErweitert(RechteckErweitert rechteckErweitert)
        {
            rechteckErweitert.doSomething();
        }
    }
    
    public class RechteckErweitert extends Rechteck
    {
    }
    

    Du würdest jetzt gerne doSomethingWithRechteck/doSomethingWithRechteckErweitert nur einmal definieren, da der Inhalt gleich ist.

    In diesem Fall könntest du in der Klasse Figuren Generics verwenden (Syntax evtl. falsch, da ich momentan kein Java mache):

    public class Figuren<TRechteck extends Rechteck>
    {
        public void doSomethingWithRechteck(TRechteck rechteck)
        {
            rechteck.doSomething();
        }
    }
    
    public class Rechteck
    {
        public void doSomething()
        {
        }
    }
    
    public class RechteckErweitert extends Rechteck
    {
    }
    

    Dann kannst du sowohl Rechteck als auch RechteckErweitert an eine Instanz von Figuren übergeben:

    Figuren<Rechteck> rechteckFiguren = new Figuren<Rechteck>();
    Rechteck rechteck = new Rechteck();
    rechteckFiguren.doSomething(rechteck);
    
    Figuren<RechteckErweitert> rechteckErweitertFiguren = new Figuren<RechteckErweitert>();
    RechteckErweitert rechteckErweitert = new RechteckErweitert();
    rechteckErweitertFiguren.doSomething(rechteckErweitert);
    

Anmelden zum Antworten