Problem mit: Vererbung , ADT und einer Funktion

pyro2k8

Mitglied
Hallo !

Ich habe ein Problem mit Vererbung im Zusammenhang mit ADTs... (Arraylist).
Die Grundstruktur:

public abstract class Geo_Objekte { ... }

public class Kreis extends Geo_Objekte {
public int getMittelpunkt() { ... }

...
}

So, jetzt möchte ich eine Arraylist benutzen, um verschiedene Objekte zu speichern...also:

ArrayList<Geo_Objekte> tmp = new ArrayList<Geo_Objekte>();

Da sollen also u.A. Kreis Objekte rein (natürlich habe ich auch noch andere Klassen, die von Geo_Objekte erben). Jetzt möchte ich später die Funktion getMittelpunkt() aufrufen, z.B.:

System.out.println(tmp.get(0).getMittelpunkt() );

Es wird die Funktion getMittelpunkt nicht gefunden, weil sie in der Klasse Geo_Objekte nicht vorhanden ist. Ist ja irgendwo auch logisch :) - aber wie löst man sowas ? Das ist ja eigentlich eine Grundidee der Vererbung, dass ich eine Funktion erst in einer erbenden Klasse habe und diese aufrufen möchte.

Vielen Dank und Grüße,
Tim
 

Antoras

Top Contributor
Java:
public abstract class GeoObjekt {
  public abstract int getMittelpunkt();
}
public class Kreis extends GeoOjekt {
  @Override
  public int getMittelpunkt() {}
}
Edit: Vererbung sollte sparsam benutzt werden. Das hilft dir auch weiter:
Java:
public interface GeoObjekt {
  int getMittelpunkt();
}
public class Kreis implements GeoOjekt {
  @Override
  public int getMittelpunkt() {}
}
 
Zuletzt bearbeitet:

pyro2k8

Mitglied
Ja genau die Idee hatte ich auch, aber das Problem ist, dass ich noch eine Klasse Polynom habe (Rechteck bzw. Dreieck), die auch von GeoObjekt erbt.
Ist alles ziemlich sinnfrei ;) Aber ist halt ne Aufgabe die mir so gestellt wurde :/

Wenn ich jetzt ein Interface implementiere und diese Funktion getMittelpunkt() vorgebe, dann wird Sie mitvererbt - aber ich muss sie dann auch in der Klasse Polynom ausführen. Dort soll es die Funktion getMittelpunkt() aber nicht geben.

Weitere Ideen ? ;)

Grüße & erstmal gute Nacht
 

Wortraum

Bekanntes Mitglied
Du kannst überprüfen, um was für ein Objekt es sich genau handelt. (Es empfiehlt sich übrigens, sich bei der Schreibung der Klassenamen an Java-Konventionen zu halten und auch nur die Einzahl zu verwenden.)

Code:
ArrayList<GeoObjekt> tmp = new ArrayList<GeoObjekt>();
…
for (GeoObjekt o : tmp) {
    if (o instanceof Kreis) {
        Kreis k = (Kreis) o; /* Typumwandlung von GeoObjekt zu Kreis */
        System.out.println(k.getMittelpunkt());
    }
}

Natürlich mußt Du das nicht in einer Schleife machen:
Code:
GeoObjekt o = tmp.get(0);
if (o instanceof Kreis) {
    System.out.println(((Kreis) o).getMittelpunkt());
} else {
    System.out.println("Das Geo-Objekt ist kein Kreis.");
}

Es ist auch erlaubt, getMittelpunkt() zu erben, obwohl Polynom keinen Mittelpunkt zurückgeben soll. In der Schnittstelle könnte beispielsweise als Javadoc-Kommentar stehen, daß getMittelpunkt() null zurückgibt, wenn ein Mittelpunkt nicht berechnet werden kann. In Polynom stünde dann einfach:
Code:
public Integer getMittelpunkt() {
    return null;
}
Das könnte ebenso auch die Standardimplementation in der Oberklasse sein, so daß jedes GeoObjekt null zurückgibt, das die Methode nicht überschreibt.

Man muß sich natürlich immer fragen, wie sinnvoll das ist, wie aufwendig andere Lösungen sind, ob es ins Konzept paßt, welche Schwierigkeiten entstehen können und so weiter. Hier bekommt man beispielsweise nicht einfach nur int zurück, sondern ein Integer-Objekt, und dann muß man bei jedem Aufruf auf null prüfen. Ich möchte Dir damit auch nur zeigen, daß man eine Methode in einer Schnittstelle oder in einer Oberklasse aufnehmen kann, auch wenn sie bei einer der Unterklassen nichts macht oder nicht so ganz paßt. Die Frage lautet halt immer: Ist es sinnvoll?
 
Zuletzt bearbeitet:

Antoras

Top Contributor
Man könnte das auch mit Generics und Polymorphie lösen:
Java:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class GeoForm {
	
	public static final Sphere GEO_SPHERE = new Sphere();
	public static final Rectangle GEO_RECTANGLE = new Rectangle();
	
	private Map<String, GenericGeoObject<? extends GeoObject>> o = null;

	public static void main(String[] args) {
		new GeoForm();
	}
	
	public GeoForm() {
		o = new HashMap<String, GenericGeoObject<? extends GeoObject>>();
		o.put(Sphere.class.getName(), new SphereImplementation());
		o.put(Rectangle.class.getName(), new RectangleImplementation());
		
		Sphere s = new Sphere(7);
		Rectangle r = new Rectangle();
		
		addType(s);
		addType(r);
		showType(s);
		showType(r);
		System.out.println("Center: " + getCenter());
		System.out.println("Number of lines: " + getNumberOfLines());
	}
	
	@SuppressWarnings("unchecked")
	public <T extends GeoObject> void showType(T geo) {
		getGenericGeoObject(geo).print(geo);
	}
	
	@SuppressWarnings("unchecked")
	public <T extends GeoObject> void addType(T geo) {
		getGenericGeoObject(geo).add(geo);
	}
	
	public int getCenter() {
		return ((SphereGeoObject) getGenericGeoObject(GEO_SPHERE)).getCenter();
	}
	
	public int getNumberOfLines() {
		return ((RectangleGeoObject) getGenericGeoObject(GEO_RECTANGLE)).getNumberOfLines();
	}
	
	@SuppressWarnings("unchecked")
	private <T extends GeoObject> GenericGeoObject getGenericGeoObject(T geo) {
		for (Map.Entry<String, GenericGeoObject<? extends GeoObject>> o : this.o.entrySet()) {
			if (o.getKey().equals(geo.getClass().getName())) {
				return o.getValue();
			}
		}
		return null;
	}
}

interface GeoObject {}

class Sphere implements GeoObject {
	private int m;
	public Sphere(int m) { this.m = m; }
	public Sphere() {}
	public int getCenter() { return m; }
}

class Rectangle implements GeoObject {
	private int a, b, c, d;
}

interface GenericGeoObject<T> {
	void print(T geo);
	void add(T geo);
}

interface SphereGeoObject extends GenericGeoObject<Sphere> {
	int getCenter();
}

interface RectangleGeoObject extends GenericGeoObject<Rectangle> {
	int getNumberOfLines();
}

class SphereImplementation implements SphereGeoObject {
	
	private List<Sphere> l = new ArrayList<Sphere>();

	@Override
	public int getCenter() {
		return l.get(0).getCenter();
	}

	@Override
	public void print(Sphere geo) {
		System.out.println("Sphere");
	}

	@Override
	public void add(Sphere geo) {
		l.add(geo);
	}
}

class RectangleImplementation implements RectangleGeoObject {
	
	List<Rectangle> l = new ArrayList<Rectangle>();

	@Override
	public int getNumberOfLines() {
		return 4;
	}

	@Override
	public void print(Rectangle geo) {
		System.out.println("Rectangle");
	}

	@Override
	public void add(Rectangle geo) {
		l.add(geo);
	}
}
Ok, den Code dürftest du jetzt nicht komplett verstanden haben. Hab hier auch mit Kanonen auf Spatzen geschossen. Und bin mir jetzt nicht mal mehr sicher ob der Code überhaupt das macht was du brauchst. Nimm lieber den von meinem Vorposter. ;)
Aber du siehst schon, das wird alles schnell kompliziert, vor allem wenn sich die einzelnen Objekte wie jetzt bei dir nicht stark genug voneinander unterscheiden.

Guter Rat: Such nicht nach Gleichnissen wenn es keine gibt. Benutz lieber nur eine Oberklasse in der nur das drinsteht was auch gleich ist. Den Rest musst wohl selbst implementieren.

Speicher den Code von mir irgendwo und erinnere dich in nem Jahr noch mal daran, dann wirst von dem nämlich begeistert sein...
 
Zuletzt bearbeitet:

Wortraum

Bekanntes Mitglied
Ich bin begeistert ob all der genutzten Möglichkeiten, nur der Nutzen verschließt sich mir noch. Vielleicht kannst Du dazu ein paar Zeilen schreiben.
(Ich meine das nicht ironisch.)
 
Zuletzt bearbeitet:

Antoras

Top Contributor
Die Frage nach dem Nutzen hab ich mir auch gestellt nachdem ich mit dem Code fertig war. Ursprünglich hab ich den Aufbau des Codes dem DAO-Pattern nachempfunden. Übrig geblieben ist die Polymorphie und die Möglichkeit Teile der Logik einfach auszutauschen bzw. zu erweitern.

Der Code lohnt sich allerdings erst dann, wenn er als Art API genutzt wird. Wenn mehrere Programmieren an einem Projekt beteiligt sind ermöglicht er, dass diejenigen, die die API nur nutzen nicht wissen müssen wie die Logik auf den Aufruf reagiert. In diesem Fall können beliebige Objekte an die Methode
Code:
showType()
übergeben werden. Durch Änderung des Codes wäre es außerdem möglich beliebige Kreisobjekte an die Methode
Code:
getCenter()
zu übergeben - die Logik würde dafür Sorgen, dass der richtige Mittelpunkt ermittelt wird. Die zu übergebenen Objekte wären hier Sphere und Rectangle, die nur die Attribute, aber keine Logik beinhalten. Auch müsste man sich keine Gedanken um die Speicherung der Objekte machen - ein Gedanke,der auch dem DAO-Pattern entsprungen ist. Die Ermittlung des Mittelpunktes ist allerdings so einfach, dass es eigentlich keinen Sinn macht dessen Implementierung in die Implementierungsobjekte zu stecken.

Der Haken an der ganzen Sache ist der, dass man erstens nur Objekte übergeben kann, die der Logik bereits bekannt sind und zweitens, dass man alle Methoden die nicht in dem
Code:
GenericGeoObject<T>
vorhanden sind noch mal explizit in dem Controller deklarieren muss.
Ich bin allerdings gerade dabei ein Art Plugin-System zu entwickeln, das dem Nutzer ermöglichen soll, dass er neue Objekte ohne Änderung des Quelltextes der API benutzen kann. Weiter bin ich gerade am rumüberlegen wie man letzteren genannten Nachteil umgehen kann. Ich hab mir gedacht, dass es eine Methode
Code:
getSpecificObject(...)
geben könnte, die einem anhand von einem übergebenen String zur Laufzeit den Rückgabewert ermittelt. Das funktioniert aber noch nicht so wie ich mir das vorgestellt hab, auch weil ich momentan keine Zeit hab da effektiv weiterzuarbeiten.

In obigen Fall wäre das ganze aber viel zu overpowered. Aber man kann es sich ja für später aufheben und es wieder rausgraben wenn es sinnvoll nutzbar scheint...
 

faetzminator

Gesperrter Benutzer
Ja genau die Idee hatte ich auch, aber das Problem ist, dass ich noch eine Klasse Polynom habe (Rechteck bzw. Dreieck), die auch von GeoObjekt erbt.

Zumindest beliebige Drei- und Vierecke und 360/n° n-Ecke haben doch auch einen "definierten" Mittelpunkt? Von einem Rechteck (Pos [c]{x, y}[/c] links oben) wär das [c]{x + w/2, y + h/2}[/c].
 

Wortraum

Bekanntes Mitglied
@Antoras:
Ich verstehe. Danke Dir für Deine Antwort!

@faetzminator:
Man müßte die mathematischen Kenntnisse haben, um einen Mittelpunkt zu errechnen. :D

Es geht wohl auch nicht darum, ob das Ding nun einen Mittelpunkt hat oder nicht, sondern wie man eine Methode objektorientiert verwurstet, wenn es erbende Objekte gibt, die mit dieser Methode nichts anfangen können. Stattdessen könnte man auch Fahrzeug, Auto und Eisenbahn und eine Methode getReifenLuftdruck() nehmen.
 

Schumi

Bekanntes Mitglied
Die Frage ist doch, warum willst Du in einem Kontext, in dem Du nur die Oberklasse hast (also bei der Verwendung des Arrays) jetzt eine Methode verwenden, welche nur in bestimmten Unterklassen definiert ist. (Was soll denn in diesem Arbeitsschritt mit den anderen Klassen passieren?)
Das ist imo ein Problem, welches man schon Designseitit zu verhindern versuchen sollte.
 

Wortraum

Bekanntes Mitglied
Natürlich sollte man versuchen, so etwas nicht in Übermaß zu produzieren. Oft sind die Dinge aber nicht so klar trennbar, man merkt erst später, daß man sich verplant hat, oder man arbeitet mit fremden Klassen. Das Ergebnis kann ja trotzdem übersichtlicher, einfacher und verständlicher sein als eine komplexe, überzogene, aber theoretisch elegante Lösung.

Aber Du hast recht, daß es ebenso ein Indiz für ein Entwurfsfehler sein kann. Ich selbst tue mich mit solchen Entscheidungen schwer; es ist einfach eine Frage der Erfahrung und des Wissens. Ich sage auch nur, daß es diese Möglichkeit gibt und daß man sie in der Praxis auch verwendet (und man findet so etwas sogar im JDK selbst).

Wenn jemand eine gute Idee hat oder einen besseren Vorschlag machen kann, interessiert mich das auch; man möchte ja hinzulernen. „Das kann man besser machen“ hilft leider nicht viel.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
J Konstruktor Problem bei Vererbung Java Basics - Anfänger-Themen 1
S Problem bei Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 3
J Vererbung Kleines Problem bei Vererbung! Java Basics - Anfänger-Themen 2
M Vererbung Problem Vererbung/Exceptions Java Basics - Anfänger-Themen 9
V Vererbung Folgendes Problem zur Vererbung ... Java Basics - Anfänger-Themen 3
R Vererbung - Unresolved compilation problem Java Basics - Anfänger-Themen 4
L Problem mit Vererbung (extends) cannot find symbol Java Basics - Anfänger-Themen 3
A Problem mit Vererbung Java Basics - Anfänger-Themen 5
M Problem mit Erweitertem Klassenkonzept (Vererbung) Java Basics - Anfänger-Themen 22
D Problem mit Objekten Vererbung deklarieren initialisieren usw Java Basics - Anfänger-Themen 12
M Problem mit package und Vererbung Java Basics - Anfänger-Themen 6
C Problem mit Vererbung Java Basics - Anfänger-Themen 10
X Problem bei Vererbung Java Basics - Anfänger-Themen 12
V Problem mit Aggregation und Vererbung Java Basics - Anfänger-Themen 4
S Problem mit Vererbung Java Basics - Anfänger-Themen 4
L Problem mit Vererbung! Java Basics - Anfänger-Themen 4
W Problem bei Vererbung Java Basics - Anfänger-Themen 14
frau-u Problem mit Klassen und Vererbung - benutzen von Methoden Java Basics - Anfänger-Themen 2
R Best Practice Problem mit (einfacher) Doppelt-Schleife Java Basics - Anfänger-Themen 53
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben