Vererbung Vererbung, Interfaces und OOP...

Vulpecula

Mitglied
Hallo zusammen! Ich habe mal ein paar konkrete Fragen in Sachen Vererbung und Objektorientierung. Und zwar geht es in einer Aufgabe darum, den Vierecken in der Abbildung eine hierarchische Struktur zuzuweisen:



Das Bild habe ich aus der Wikipedia und habe auch direkt schon mit Pfeilen eine Hierarchie deutlich gemacht.

Mein Plan ist jetzt, die Klasse Viereck als abstrakte Klasse zu formulieren und dann die Klassen darunter davon Erben zu lassen. Hier komme ich aber bereits ins straucheln.

  1. Als Methoden möchte ich je Körper erstmal die Formeln für Fläche und Umfang implementieren. Da ich allerdings unterschiedliche Formeln benötige, ist ja auch jedes Mal die Signatur des Konstruktors eine andere. Ich könnte mit mehreren Konstruktoren arbeiten, aber muss ich dann in JEDER (ver)erbenden Klasse den selben Haufen Konstruktoren ausformulieren? Was wäre die eleganteste Art, um das Problem zu lösen?
  2. In der Abbildung wird ja deutlich, dass Quadrat seine Eigenschaften sowohl vom Rhombus als auch vom Rechteck erbt. Mehrfachvererbung ist in Java ja nicht möglich, daher liegt die Verwendung eines Interface nahe. Wie würde das in diesem Fall zur Anwendung kommen? (Bzw.: Wie würde man Interfaces generell bei Fällen einsetzen, wo ansonsten eine Mehrfachvererbung bestehen würde?)

MfG - Vulpecula
 
Zuletzt bearbeitet:

Tobse

Top Contributor
Du hast es mit den Interfaces erfasst. Definiere Interfaces dafür und überlass die Konstruktion den implementationen. best practice wäre natürlich ein Interface Viereck und den Rest als Vererbungsbaum zu ralisieren. Da du aber im Java nur von einer Klasse erben kannst, geht das in Java nicht.
 

wolfgang63

Bekanntes Mitglied
Etwas zu vererben macht nur Sinn wenn zwei Objekte etwas gleich haben. (Eigenschaft od. Methode)
Außer den vier Ecken sehe ich hier keine Gemeinsamkeiten.
Was willst du hier vererben, bzw. wo ist hier eine Hierachie?
Jede Form hat seine Eigenheiten.
 

Vulpecula

Mitglied
Naja, es gibt schon Gemeinsamkeiten... Für ein abstraktes Viereck gilt ja z.B.: vier Seiten/Ecken, zwei Diagonale, Fläche, Umfang. Das sind ja schonmal Eigenschaften, die für ALLE Vierecke gelten, egal ob es sich dabei um ein Trapez oder ein konv. Viereck handelt. Die Methode zur Berechnung der Fläche kann ich ja z.B. durch die abstrakte Klasse erzwingen und in den einzelnen, vererbten Klassen überschreiben.
Dazu kommt, dass zwar jede Form Eigenheiten hat, aber ein Quadrat ist. z.B. auch eine Art Rechteck, welches wiederum eine Art von Parallelogramm ist, usw... Mag sein, dass sich die Formeln ändern, aber an der Tatsache, dass Gemeinsamkeiten bestehen, ändert das nichts.
 
Zuletzt bearbeitet:

Tobse

Top Contributor
Etwas zu vererben macht nur Sinn wenn zwei Objekte etwas gleich haben. (Eigenschaft od. Methode)
Außer den vier Ecken sehe ich hier keine Gemeinsamkeiten.
Was willst du hier vererben, bzw. wo ist hier eine Hierachie?
Jede Form hat seine Eigenheiten.

Da wären z.B. Dinge wie Kantenlänge gegenüberliegender Seiten, Winkelsumme, Umfang, Mittelpunkt etc. Wenn man diese Eigenschaften betrachtet lassen sich schon sinnvolle Gruppen erstellen. Aber z.B. das hier ist leider nicht möglich:
Java:
class Shape
{
    protected int[] bounds = new int[]; // n seiten
    protected int[] angles = new int[]; // n seiten

    public final int getNumSides()
    {
        return bounds.length;
    }
    public void setBounds(int... bounds)
    {
        if (bounds.length != this.bounds.length)
        {
            throw new IllegalArgumentException("Too many/few new bounds");
        }
        this.bounds = bounds;
    }
    public void setAngles(int... angles)
    {
        if (angles.length != this.angles.length)
        {
            throw new IllegalArgumentException("Too many/few new angles");
        }
        this.angles = angles;
    }
}
class Viereck extends Shape
{
    public Viereck()
    {
        bounds = new int[4]; // 4 seiten
        angles = new int[4]; // 4 seiten
    }

    public setBounds(int a, int b, int c, int d)
    {
        this.bounds[0] = a;
        this.bounds[1] = b;
        this.bounds[2] = c;
        this.bounds[3] = d;
    }
    public setAngles(int a, int b, int c, int d)
    {
        if (a + b + c + d != 360)
        {
            thow new DefinitionException("Die Winkelsumme im Viereck ist immer 360°");
        }
        this.angles[0] = a;
        this.angles[1] = a;
        this.angles[2] = a;
        this.angles[3] = a;
    }
}
class Quadrat extends Rechteck, Raute
{
    // keine Implementierung nötig, die Eigenschaften aus Parallelogramm, Rechteck und Raute
    // kombiniert reichen aus
}
class Parallelogramm extends Viereck
{
    public void setBounds(int a, int b, int c, int d)
    { // ab dem parallelogramm sind sich gegenüberliegende seiten immer gleich
        if (a != c || b != d)
        {
            throw new DefinitionExcetpion("Gegenüberliegende Seiten sind im Parallelogramm gleich.");
        }
        super(a, b, a, b);
    }
}
class Raute extends Parallelogramm
{
    public void setBounds(int a, int b, int c, int d)
    { // ab der Raute sind alle seiten gleich
        if (a != b || a != c || a !=d)
        {
            throw new DefinitionExcetpion("In der Raute sind alle Seiten gleich.");
        }
        super(a, a, a, a);
    }
}
class Rechteck extends Parallelogramm
{
    public void setAngles(int a, int b, int c, int d)
    {
        if (a != 90 || b != 90 || c != 90 || d != 90)
        {
            throw new DefinitionException("Im Rechteck sind alle Winkel = 90°");
        }
        super(90);
    }
}
 
Zuletzt bearbeitet:

Ruzmanz

Top Contributor
Mehrfachvererbung ist in Java nicht möglich. Auf Interfaces würde ich aber nur bei unabhängigen Klassen zurückgreifen. In diesem Fall beschreibt ein Parallelogramm die drei Klassen Rechteck, Raute und Quadrat komplett.
 

JavaProfi

Aktives Mitglied
Der Fehler liegt hier in der Logik und damit bereits im Modell.
Hier will man mit Vererbung etwas abbilden, was kein Fall von Vererbung ist.

(1) Zunächst einmal zum Begriff "Eigenschaften".
Es ist besser den Begriff "Attribute" zu verwenden. Warum?

Welche Attribute beschreiben ein Viereck?
Welche Attribute beschreiben ein Trapez?

Man wird feststellen, es sind dieselben.

Die "Eigenschaft", dass ein Trapez zwei parallele Seiten hat ist kein beschreibendes Attribut. Man würde es ggf. als Methode isTrapez() implementieren, die berechnet, ob das Viereck zwei parallele Seiten hat und daher ein Trapez ist und TRUE oder FALSE zurückliefern.

"Eigenschaften" umfassen somit "Methoden" und "Attribute" !!
Das ist eine wichtige Erkenntnis beim Modellieren.

(2)
Bei der Modellierung von Klassen sind zunächst die Attribute entscheidend, welche die Instanzen der Klasse beschreiben. Nicht alles, was andere Eigenschaften hat wird als eigene Klasse implementiert. So sind Asiaten und Europäer keine eigenen Unterklassen einer Klasse Mensch, sondern die Attribute mit denen sie beschrieben werden sind gleich. Obwohl Asiaten eine besondere Eigenschaft haben (z.B. Mandelaugen oder immer schwarzes Haar) rechtfertigt das keine eigene Klasse und damit auch keine Vererbung von der Klasse Mensch.
Hier könnte ggf. ein Attribut "Rasse" in der Klasse Mensch zur Unterscheidung implementiert werden.


(3)
Vererbung in der OOP und insbesondere in Java zielt auf "Erweiterung" (--> extends !!) einer bestehenden Klasse ab. Die Oberklasse muss also um Attribute oder Methoden erweitert werden, die in der Oberklasse selbst keinen Sinn machen würden. Es geht also um Spezialisierung auf der einen und Abstraktion auf der anderen Seite.

(4)
Mehrfachvererbung ist sehr problematisch. Wenn z.B. beide geerbten Klassen die gleiche Methodensignatur verwenden, wäre unklar, welche aufgerufen werden soll. Noch problematischer wird es wenn Attribute mehrfach vererbt werden. Daher haben die Entwickler von Java wohlweislich darauf verzichtet. Es gibt keine Mehrfachvererbung, jedoch eine Mehrfachtypisierung

(5)
Mehrfachtypisierung wird über Interfaces implementiert. Über die definierten Methodensignaturen einigen sich die implementierenden Klassen darauf, eine vorgegebene Methode zu implementieren. Damit "erbt"eine Klasse gewissermaßen einen bestimmten Typ. Da eine Klasse mehrere Interfaces implementieren kann, kann dadurch eine Klasse unterschieldlichen Typen angehören.


Gruß
JP
 

Vulpecula

Mitglied
Mehrfachtypisierung wird über Interfaces implementiert. Über die definierten Methodensignaturen einigen sich die implementierenden Klassen darauf, eine vorgegebene Methode zu implementieren. Damit "erbt"eine Klasse gewissermaßen einen bestimmten Typ. Da eine Klasse mehrere Interfaces implementieren kann, kann dadurch eine Klasse unterschieldlichen Typen angehören.

Hier habe ich anscheinend noch Verständnisprobleme. Wenn also über Interfaces eine Art "Typisierung" stattfindet, ist diese aber rein informeller Natur, oder? Soll heißen: Bestimmte Features der Vererbung würden dadurch verloren gehen, wie z.B. die Vererbung von Attributen und/oder Methoden und diese müssten in der Klasse auf jeden Fall neu implementiert werden (sofern dies nich eh schon durch das Interface erzwungen wird).

Irgendwie verstehe ich die Vererbungs-Geschichte noch nicht so ganz. Überall liest man, dass es besser ist, so wenig wie möglich zu vererben und stattdessen Interfaces zu benutzen, nur warum wird diese Funktionalität dann geboten? Außerdem wird diese Aufgabe mit den Vierecken immer frustrierender, je länger ich darüber brüte. Im Moment weiß ich jedenfalls nicht, wie ich da weitermachen soll.
:bahnhof:
 

KSG9|sebastian

Top Contributor
Vererbung ist gut, allerdings wird es zu oft mißbraucht für Dinge für die es nicht gedacht ist.

Deine Idee mit der Vererbung funktioniert zwar, bricht aber genau genommen die Regeln von Vererbung.

Wie schon geschrieben bedeutet Vererbung eine Erweiterung. Bestehende Funktionen der Superklasse müssen weiterhin gleich funktionieren.

Nun gibt es das Paradebeispiel dafür:

Java:
class Rechteck {
   setSeite(int seiteA, int seiteB) { this.a = seiteA; this.b = seiteB; }
}

class Quadrat extends Rechteck{
   setSeite(int seiteA, int seiteB) { if(seiteA != seiteB) throw new IllegalArgumentException("a muss gleich b sein"); super.setSeite(seiteA, seiteB); }
}

Ganz einfacher Code..Klasse Rechteck definiert eine Methode um die Seiten a und b zu setzen. Beim Rechteck gibt es keine Einschränkung.

Nun gibt es einen Subtyp Quadrat welcher sagt: "die Seiten müssen gleichlang sein, sonst ist es kein Quadrat". Mit dieser Einschränkung sind die Richtlinien für Vererbung schon gebrochen.

Dadurch ändert man nämlich bestehende Funktionalität der Superklasse - man schränkt die Funktionalität ein anstatt sie zu erweitern.

Mann kann es auch als Haarspalterei sehen, aber gerade im Bereich Frameworkentwicklung sind solche Dinge sehr, sehr übel.

Hat ein verwender nun einfach eine Liste von Rechtecken und eine Funktion "alle Seiten auf a=2, b=3" setzen, dann bekommt er eine Exception. Anschließend wird er in der Schleife instanceof-Abfragen einbauen und somit ist die Vererbung mehr oder weniger wieder ausgehebelt.

Interfaces sind eine gute Lösung für dein Problem.

Interfaces beschrieben nur welchen Vertrag eine Klasse erfüllen muss. Wie die Implementierung aussieht ist dem Interface (und eigentlich auch dem Verwender) egal. Bei Interfaces geht auch "Mehrfachvererbung".
 
Zuletzt bearbeitet:

Unlikus

Mitglied
Da wären z.B. Dinge wie Kantenlänge gegenüberliegender Seiten, Winkelsumme, Umfang, Mittelpunkt etc.

Das kommt sehr darauf an, was man unter einem Mittelpunkt versteht. Einen Umkreismittelpunkt besitzen nur Sehenvierecke, hier nur Quadrat und Rechteck, bzw ein gleichschenkliges Trapez.
Inkreismittelpunkt besitzten nur Tangtenvierecke, hier nur Quadrat und Rombus, eventuell eine spezialfrom des Trapez.
Mittelpunkt als Schnittpunkt der Diaogonalen, geht bei konkaven Vierecken nicht gut auf, da der Schnittpunkt dort außerhalb des Vierrecks liegt und damit irgentwie nicht mehr so richtig in der Mitte.
 

Tobse

Top Contributor
Das kommt sehr darauf an, was man unter einem Mittelpunkt versteht. Einen Umkreismittelpunkt besitzen nur Sehenvierecke, hier nur Quadrat und Rechteck, bzw ein gleichschenkliges Trapez.
Inkreismittelpunkt besitzten nur Tangtenvierecke, hier nur Quadrat und Rombus, eventuell eine spezialfrom des Trapez.
Mittelpunkt als Schnittpunkt der Diaogonalen, geht bei konkaven Vierecken nicht gut auf, da der Schnittpunkt dort außerhalb des Vierrecks liegt und damit irgentwie nicht mehr so richtig in der Mitte.

Ist schon klar. Was spricht gegen eine
Code:
InformationNotAvailableException
?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
N OOP Vererbung von Interfaces Java Basics - Anfänger-Themen 12
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
L Java- Vererbung Java Basics - Anfänger-Themen 4
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 12
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 1
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
M Vererbung Java Basics - Anfänger-Themen 6
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Java Basics - Anfänger-Themen 7
D Vererbung Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
H Datenkapselung, Vererbung und UML Java Basics - Anfänger-Themen 16
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
1 Vererbung Klassenattribute Java Basics - Anfänger-Themen 9
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
N Thema Vererbung Java Basics - Anfänger-Themen 31
A Vererbung Vererbung Übung Java Basics - Anfänger-Themen 5
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
Y Vererbung Konto - Anfangsprobleme Java Basics - Anfänger-Themen 7
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
M Vererbung mit Enums Java Basics - Anfänger-Themen 8
Kirby.exe Vererbung im Detail erklärt? Java Basics - Anfänger-Themen 9
N Modellierung, vererbung, Java Basics - Anfänger-Themen 163
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung im Computerspiel Java Basics - Anfänger-Themen 7
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
I Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
V Vererbung Java Basics - Anfänger-Themen 2
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
J Vererbung Java Basics - Anfänger-Themen 3
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
O Vererbung änderung des Konstruktors Java Basics - Anfänger-Themen 8
L Vererbung Java Basics - Anfänger-Themen 5
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
A Objekterstellung bei der Vererbung Java Basics - Anfänger-Themen 7
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
S Vererbung Java mehrfach Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
A Klassen Vererbung privater Methoden und Member Java Basics - Anfänger-Themen 12
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
J Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Generizität und Vererbung Java Basics - Anfänger-Themen 4
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
K Vererbung Octagon von Circle Java Basics - Anfänger-Themen 0
B Hilfe bei Vererbung Java Basics - Anfänger-Themen 2
D Vererbung Frage zum Klassenaufbau mit Vererbung Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 1
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
O Vererbung Java Basics - Anfänger-Themen 5
MiMa Vererbung Theorie OK, Praxis ?? Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 10
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
G Vererbung Java Basics - Anfänger-Themen 12
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
J Vererbung Vererbung von Methoden Java Basics - Anfänger-Themen 6
B Vererbung Java Basics - Anfänger-Themen 12
K Vererbung (super) Java Basics - Anfänger-Themen 2
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
J Java: static bei Vererbung Java Basics - Anfänger-Themen 5
C Vererbung Java Basics - Anfänger-Themen 4
L Vererbung Java Basics - Anfänger-Themen 3
J Klassenorganisation | Vererbung Java Basics - Anfänger-Themen 1
B Vererbung Vererbung Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Benötige Hilfe bei Vererbung Java Basics - Anfänger-Themen 1
M Anfängerprobleme mit Vererbung Java Basics - Anfänger-Themen 27
J Vererbung Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben