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();