2017-05-03 3 views
3

Ich habe Schwierigkeiten, die Struktur meines Codes einzurichten. In einem Projekt habe ich zwei Klassen LeftCell und RightCell, beide erweitern Klasse Cell. Um Code-Duplizierung zu vermeiden, möchte ich diese Objekte nun in mehreren anderen Projekten verwenden. Das Problem ist, dass ich diesen Objekten (insbesondere dem Objekt Cell), die sich pro Projekt unterscheiden, zusätzliche Funktionalitäten hinzufügen möchte.Änderung der Vererbungshierarchie zur Reduzierung der Codeverdoppelung

Angenommen, ich erstelle ein neues Projekt, in dem ich Cell Objekte mit einer void draw() Methode visualisieren möchte. Mein erster Gedanke war, eine neue CellProject1 Klasse zu erstellen, die die Cell-Klasse erweitert und umfasst die draw() Methode:

class CellProject1 extends Cell { 
    void draw() {} 
} 

Das Problem ist, dass alle LeftCell/RightCell Objekte, die ich schaffen, haben natürlich keinen Zugriff auf diese draw() Verfahren . Ich glaube, ich möchte irgendwie eine Cell Unterklasse in der Klassenhierarchie quetschen, so dass sie sich ändert von:

Cell 
    LeftCell 
    RightCell 

zu:

Cell 
    CellProjectX 
     LeftCell 
     RightCell 

je nach Projekt Ich renne. Ich habe mit Generika herumgespielt, kann es aber nicht zur Arbeit bringen. Alle Vorschläge sind willkommen!

Antwort

0

Das Problem ist, dass alle LeftCell/RightCell Objekte, die ich erstellen Sie von natürlich keinen Zugriff auf diese Methode draw() haben.

Eine für eine untergeordnete Klasse spezifische Methode kann natürlich nicht für eine übergeordnete Instanz aufgerufen werden, die sie nicht kennt.

Da Ihre Anforderung

Vererbungshierarchie Änderungs Code zu reduzieren, ist Duplizierung In einem Projekt, ich habe zwei Klassen LeftCell und RightCell sowohl abgeleitete Klasse Cell. nun zu vermeiden, Code-Duplizierung, mag ich diese Objekte in mehr anderen Projekten verwenden

Ich denke, dass man die Dinge ein wenig anders machen sollte.

Wenn Sie die Anzahl der Kombination möglich von Klassen Explosion zu vermeiden und nicht LeftCell und RightCell wie in Ihrem Beispiel duplizieren:

Cell 
    CellProjectX 
     LeftCell 
     RightCell 

, die schließlich abgeschlossen werden können:

Cell 
    CellProjectY 
     LeftCell 
     RightCell 

Cell 
    CellProjectZ 
     LeftCell 
     RightCell 

Sie sollten die Zusammensetzung über die Vererbung bevorzugen, um Ihr spezifisches Projekt Cell Implementierungen zu erstellen.

Für die gemeinsame Zellstrukturen:

Die Cell Unterklasse könnte eine Cell Schnittstelle sein, die für jeden Cell gängige Methoden definieren und Sie könnten eine AbstractCell Klasse, die für sie gemeinsame Umsetzung definiert.

public interface Cell{ 
    int getValue(); 
    void setValue(int value); 
} 


public abstract class AbstractCell implements Cell{ 
     ... 
} 

Dann könnten Sie die RightCell und LeftCell durch die Erweiterung AbstractCell definieren:

public class RightCell extends AbstractCell { 
     ... 
} 

public class LeftCell extends AbstractCell { 
     ... 
} 

für die Zelle Implementierungen spezifisch für ein Projekt:

nun in einem bestimmten Projekt könnten Sie ein erstellen eine benutzerdefinierte Cell Implementierung durch Zusammensetzen mit einer Cell Instanz (schließlich eine LeftCell oder RightCell Instanz), die unter der Haube verwendet werden, um die Cell Schnittstelle in der konkreten konkreten Projektklasse zu implementieren.
In der spezifischen Implementierung können Sie natürlich alle erforderlichen projektspezifischen Methoden hinzufügen.
Zum Beispiel:

class CellProject1 implements Cell { 

    private Cell cell; 

    CellProject1 (Cell cell){ 
     this.cell = cell; 
    } 

    public int getValue(){ 
     cell.getValue(); 
    } 

    public void setValue(int value){ 
     cell.setValue(value); 
    } 

    public void draw(){ 
    ... 
    } 

} 

Sie können so CellProject1 Instanzen wie das schaffen:

CellProject1 leftCell = new CellProject1(new LeftCell()); 
CellProject1 rightCell = new CellProject1(new RightCell()); 
leftCell.draw(); 
rightCell.draw(); 

Und in einem anderen Projekt, das CellProject2 Instanzen mit einer bestimmten write() Methode verwendet, könnten Sie schreiben:

CellProject2 leftCell = new CellProject2(new LeftCell()); 
CellProject2 rightCell = new CellProject2(new RightCell()); 
leftCell.write(); 
rightCell.write(); 
0

Das Problem ist, dass ich auch zusätzliche Funktionen zu diesen Objekten hinzufügen möchte (das Cell-Objekt im Besonderen), die sich pro Projekt unterscheiden.

empfehle ich die Schaffung einer Schnittstelle, die Cell implementiert, dessen Kind-Klassen erlauben, die Methoden zu implementieren, die Sie wollen, vor allem, wenn Cell eine abstrakte Klasse ist.

public interface Features { 
    ... 
} 

public abstract class Cell implements Features { 
    ... 
} 
Verwandte Themen