tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
165
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    PsychoSam PsychoSam ist offline Mitglied Bronze
    Registriert seit
    Aug 2003
    Beiträge
    39
    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!!
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Mit Wildcards sollte das kein Problem sein.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    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.
     

  3. #3
    PsychoSam PsychoSam ist offline Mitglied Bronze
    Registriert seit
    Aug 2003
    Beiträge
    39
    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...
     

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 11.01.11, 21:40
  2. Antworten: 4
    Letzter Beitrag: 22.03.06, 20:50
  3. Antworten: 0
    Letzter Beitrag: 06.10.04, 14:03
  4. PROBLEM! Pinnacle 2 GB Begrenzung Windows 2000 DC 50 PROBLEM!
    Von hennym im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 6
    Letzter Beitrag: 17.09.03, 22:09
  5. Antworten: 6
    Letzter Beitrag: 13.06.02, 12:29