2017-04-02 1 views
1

Ich habe einige Probleme mit dem Verständnis der folgenden: Ich sollte eine Schnittstelle namens IDeepCopy implementieren.IDeepCopy Interface java

Beschreibung „Diese Schnittstelle benötigt wird, da die klonbar Schnittstelle von Java zur Verfügung gestellt wird, die Klon-Methode von Objekt nicht neu deklarieren. Wir wollen es so beschränkten Typs für generische Klassen verwenden, um diese zusätzliche Schnittstelle benötigt wird. Wir haben uns entschieden zu verwenden eine IDeepCopy-Schnittstelle, die die Handhabung von Kopieren/Klonen von Objekten vereinfacht Klassen, die diese Schnittstelle implementieren, sollten eine Kopie von Objekt erstellen, indem sie entweder einen privaten Kopierkonstruktor aufrufen oder ein neues Objekt derselben Klasse erstellen und seine Werte entsprechend setzen Beachten Sie, dass Attribute von Klassen ebenfalls kopiert werden sollten (wenn sie die IDeepCopy-Schnittstelle implementieren), bevor sie für das kopierte Objekt festgelegt werden. IDeepCopy deepCopy() "

Ich habe die Schnittstelle deklariert, aber ich weiß nicht wirklich, wie ich die Methode entsprechend implementieren soll.

Meine Idee ist die folgende (Implementierung des Verfahrens in einer Unterklasse):

public SimpleProduct deepCopy(){ 
    return new SimpleProduct(x,x); 
} 

Aber wie kann ich die Attribute gesetzt gesetzt, wenn ich nicht ein Objekt als Parameter in deepcopy bekommen?

Antwort

1

Aus der Beschreibung klingt es so, als ob Sie nur die entsprechenden Werte von der ursprünglichen Instanz an die neue Instanz übergeben sollten, indem Sie .deepCopy() aufrufen, falls zutreffend. z.B.

public class SimpleProduct implements IDeepCopy { 

    private final int x; 
    private final OtherClass y; 

    public SimpleProduct(int x, OtherClass y) { 
     this.x = x; 
     this.y = y; 
    } 

    public SimpleProduct deepCopy() { 
     return (y instanceof IDeepCopy) ? new SimpleProduct(x, ((IDeepCopy)y).deepCopy()) : new SimpleProduct(x, y); 
    } 
} 

Edit: aktualisiert deepCopy Umsetzung mit dem Vorschlag von @ c0der in den Kommentaren

+0

ich überprüfen würde, wenn 'y' implementiert' IDeepCopy' vor 'y.deepCopy()' – c0der

+0

@ c0der, wenn es implementiert es nicht, es wird nicht kompiliert. –

+1

Das stimmt. Um das Beispiel generischer zu machen, können Sie 'return (y instanceof IDeepCopy) verwenden? neues SimpleProduct (x, (IDeepCopy) y.deepCopy()); : new SimpleProduct (x, y); ' – c0der

Verwandte Themen