Vererbung Klasse erbt von abstrakter Klasse implementiert Interface

  • Themenstarter Themenstarter Gelöschtes Mitglied 46222
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 46222

Gast
Hallo Java Comm,

ich hätte folgende Problemstellung:
Ich möchte zwei Klassen verwenden, die beide viele Gemeinsamkeiten haben. Mehrere Attribute sind syntaktisch und semantisch identisch. Beide sollen von einer anderen Klasse in einer sortierten Liste verwaltet werden, sie müssen also beide sortierbar sein.

Ich hab mir also folgendes überlegt:
- Eine (abstrakte) Oberklasse, die die gemeinsamen Merkmale beinhaltet - Abstrakt, da die gemeinsamen Teile alleine noch keinen "Sinn" ergeben, es also keine Objekte der Oberklasse geben sollte
- Comparable implementieren, da beide sortierbar sein müssen (aber auf unterschiedliche Art und Weise)

Zusammengenommen dachte ich mir, ich könnte das Comparable bereits in der Oberklasse verwenden, um anzuzeigen, daß alle Unterklassen die compareTo() Methode konkret implementieren müssen

Java:
public abstract Oberklasse implements Comparable<Oberklasse>
Java:
public UnterklasseA extends Oberklasse
Java:
public UnterklasseB extends Oberklasse

Leider ist das so in Java nicht möglich. Gebe ich in der Oberklasse statt des <T> die Klasse "Oberklasse" an, bekomme ich Probleme, wenn ich in der UnterklasseA compareTo implementieren will; Der Compiler überprüft die Signatur und meckert, wenn ich in UnterklasseA
Java:
public int compareTo(UnterklasseA zuvergleichendesObjekt)
versuche - er erwartet ein Objekt vom Typ Oberklasse.

Ich habe bisher 2 Möglichkeiten gefunden, um das Problem zu lösen, und beide kommen mir irgendwie... holzhämmerig vor.
1)
Java:
public abstract Oberklasse implements Comparable<Object>
Dann habe ich in der Unterklasse
Java:
public int compareTo(Object zuvergleichendesObjekt)
und muss typecasten, was das Zeug hält.
2)
Java:
public abstract Oberklasse
public UnterklasseA extends Oberklasse implements Comparable<UnterklasseA>
public UnterklasseB extends Oberklasse implements Comparable<UnterklasseB>
Löst das Problem mit der Typisierung, aber ich könnte nun Klassen von Oberklasse ableiten, die kein Comparable Interface implementieren und das möchte ich verhindern.

Gibt es noch eine elegantere Möglichkeit das um zu setzen? Oder sollte ich insgesamt umdenken?
Es handelt sich hierbei um ein Ein-Mann-Projekt mit einer sehr spezifischen Zielsetzung, aber ich möchte trotzdem so programmieren, daß auch Eventualitäten (wie eben das ableiten nur mit Implementierung von Comparable) bedacht sind.

Vielen Dank & einen angenehmen Restsonntag
Stefan
 
Ich hab ehrlich gesagt nicht komplett durchgeblickt, was du tatsächlich genau vorhast und wo das Problem liegt. Aber vielleicht hilft dir ja schon der Hinweis weiter, dass du auch den generischen Typ entsprechend auf einen bestimmten Typ einschränken kannst. Eine Abstrakte Klasse aus einem meiner Projekte hat z.B. die fogende Signatur

Java:
public abstract class AbstractBasicAdminBean<E extends IConvertableEntity> 
    implements IAdminBean<E> { 
        //...    
    }

Somit kann ich dann jeden Typ reinschmeißen, der das Interface
Code:
IConvertableEntity
implemeniert.
 
Zuletzt bearbeitet:
Ja, das hat mir extre weitergeholfen, vielen Dank!!
Ich wusste nicht, daß man die Parametervariable "weitergeben" kann.
siehe hierzu auch in der Insel:
Generischer Klassentyp implementiert generische Schnittstelle und gibt die Parametervariable weiter

So sieht nun die Signatur meiner Oberklasse aus:

Java:
public abstract class Downtime<T extends Downtime> implements Comparable<T>

CompareTo wird nicht implementiert, aber von den Unterklassen verlangt:

Java:
public class DowntimeSingle extends Downtime<DowntimeSingle>{
	@Override
	public int compareTo(DowntimeSingle dt)
	{
		// Hier könnte ihre konkrete Implementierung von compareTo stehen!
		return 0;
	}
}

analaog dazu die andere und alle weiteren Ableitungen der Oberklasse - und keine kommt ohne Comparable Interface aus.
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben