2012-03-31 8 views
0

Ich habe eine Schnittstelle und eine Klasse die Schnittstelle wie diese Umsetzung:Wie ändere ich den Parameter von einer geerbten Klasse, die eine Schnittstelle implementiert?

public interface DocumentDAO<T>{ 
    public long insert (T doc); 
} 

public class PostgreSQLDocumentDAO implements DocumentDAO<Document>{ 
    public long insert(Document doc){} 
    protected void insertDocument(Document doc){} 
} 

Ich möchte den Einsatz Methode der PostgreSQLDocumentDAO Ändern der Parameter von Dokument-Seite außer Kraft zu setzen, wo Seite ist Eine Klasse, die erweitert Dokument.

ich so etwas wie dies wollen:

public class PostgreSQLPageDAO extends PostgreSQLDocumentDAO{ 
    public long insert(Page doc){ 
     super.insertDocument(page); 
     //specific implementation goes here 
    } 
} 

Wie kann ich diese bekommen?


UPDATE: Der obige Code ist nicht richtig, weil eine Klasse Inserter verwendet die Schnittstelle DocumentDAO genannt. Wenn es die Einfügung Methode aufruft, selbst wenn ein PostgreSQLPageDAO Objekt ist, wird es die Einfügemethode aufrufen, Dokument einfügen, da diese Methode vererbt wird.

ich die legen Sie eine Art und Weise zu, wenn die Inserter Klasse aufrufen Methode tun möchte, verwendet er die Methode, die die Seite einfügt. Auf diese Weise denke ich, dass ich die insert (Document doc) von PostgreSQLDocumentDAO überschreiben muss.

+0

Was Sie beschreiben, ist, wie Polymorphismus in Java funktioniert.Was Sie verlangen, ist, dass die Schnittstelle 'DocumentDAO' in der Lage ist, eine Methode auszuwählen, die auf einem Typ basiert, von dem sie nichts weiß (d. H.' Page'). –

Antwort

3

Zwei Optionen hier.

  1. können Sie ändern PostgreSQLDocumentDAO

Sie es dann

public class PostgreSQLDocumentDAO<D extends Document> implements DocumentDAO<D> 

und

public class PostgreSQLPageDAO extends PostgreSQLDocumentDAO<Page> 

2.You ändern kann nicht PostgreSQLDocumentDAO ändern

Dann müssen Sie die Insert-Methode in PostgreSQLPageDAO überlasten und überschreiben mit:

// Override 
@Override 
public long insert(Document doc){ 
    if (!(doc instanceof Page)) 
     throw new IlegalArgumentException("insert only accepts Page"); 
    super.insert(doc); 
} 

// Overload 
public long insert(Page page){ 
    super.insert(page); 
} 
+0

Danke. Ich benutzte die Lösung Nummer eins und funktionierte gut. –

0

Ich sehe nicht ein Problem.
Da Page von Document abgeleitet ist, können Sie einfach eine Page anstelle einer Document übergeben.

Wenn Sie spezielle Behandlung in der Methode der abgeleiteten Klasse benötigen, können Sie prüfen, ob DocumentinstanceofPage ist und tun, was Sie brauchen.

Natürlich ist die Annahme, dass Sie nicht die Schnittstellen/Klassen ändern können

+0

Ich habe meine Frage bearbeitet und erklärt, was ein Problem ist. In der "Kompilierung" wird es funktionieren, aber nicht in "logischen" Begriffen. –

Verwandte Themen