OO-Problem

PsychoSam

Mitglied
Hallo

Ich habe eine Frage bezüglich Objekt-Orientierung

Ich leite in der GUI Schicht meines Programms einen Baum aus einem Graphen der App Schicht ab. Jeder Knoten des Baumes implementiert das Interface INode. Jeder Knoten des Graphen implementiert ICollectorNode. Da der Baum und der Graph über das Proxy Pattern verbunden sind, gilt: ICollectorNode extends INode. Ich möchte die GUI schicht entkoppelt haben, sodass sie keine Kenntnisse über das Interface ICollectorNode haben soll. Mein Problem ist wie folgt:
Ich möchte wenn ich die Methode childrenIterator auf INode aufrufe einen Iterator<INode> erhalten. Wenn ich aber auf ICollectorNode childrenIterator aufrufe einen Iterator <ICollectorNode>. D.h. wenn ich aus der GUI schicht auf die Appschicht zu greife erhalte ich INodes und wenn ich in der Appschicht intern arbeite, möchte ich ICollectorNodes erhalten. Das ganze wäre ja mit Co-Varianz gelöst. Blöderweiset unterstützt Java keine Covarianz von Generics, also z.b. List<A> ist kein SubTyp von List<B> selbst wenn A von B erbt...
Hat jemand eine Idee für eine saubere Lösung?

Grüße und Danke!!
 
Mit Wildcards sollte das kein Problem sein.

Java:
package de.tutorials;

import java.util.Iterator;

public class GenericTest {

	interface INode {
	}

	interface ICollectorNode extends INode {
	}

	interface IGraph {
		public Iterator<? extends INode> getNodes();
	}

	public static class InternalGraph implements IGraph {
		@Override
		public Iterator<ICollectorNode> getNodes() {
			return null;
		}
	}

	public static class GUIGraph implements IGraph {
		@Override
		public Iterator<INode> getNodes() {
			return null;
		}
	}
}

So in der Art. Achte nur darauf dass ein ? extends XYZ eigentlich nicht in der public API nach außen gegeben werden sollte. Was anderes fällt mir nur gerade nicht ein.
 
Hi danke für die Antowort

Wenn man von der spezialisierten Klasse INodes will, klappt das super. Wenn man aber intern arbeitet, aber trotzdem gegen Interfaces programmiert muss man immer von INode auf ICollectorNode umcaste...
 
Zurück