我在设置代码结构时遇到困难。在一个项目中,我有两个类LeftCell
和RightCell
,它们都扩展了类Cell
。现在,为了避免代码重复,我想在多个其他项目中使用这些对象。问题是我还想向这些对象(特别是Cell
对象)添加额外的功能,这些功能因项目而异。
假设我创建一个新项目,我想在其中使用Cell
方法可视化void draw()
对象。我的第一个想法是创建一个新的CellProject1
类,该类扩展了Cell
类并包含draw()
方法:
class CellProject1 extends Cell {
void draw() {}
}
问题是我创建的任何
LeftCell
/ RightCell
对象当然都不能访问此draw()
方法。我想我想以某种方式挤压类层次结构中的Cell
子类,使其从以下内容更改:Cell
LeftCell
RightCell
至:
Cell
CellProjectX
LeftCell
RightCell
取决于我正在运行的项目。我玩过泛型,但无法正常工作。欢迎提出所有建议!
最佳答案
问题是我创建的所有LeftCell / RightCell对象都
当然无法访问此draw()方法。
当然,不能在不知道子类的父实例上调用特定于子类的方法。
由于您的要求是
更改继承层次结构以减少代码重复
在一个项目中,我有两个类LeftCell和RightCell,两者都
扩展类Cell。
现在,为了避免代码重复,我想在
其他多个项目
我认为您应该使事情有所不同。
如果要避免爆炸可能的类组合数量,而不要像示例中那样复制LeftCell
和RightCell
:
Cell
CellProjectX
LeftCell
RightCell
最终可以通过以下方式完成:
Cell
CellProjectY
LeftCell
RightCell
Cell
CellProjectZ
LeftCell
RightCell
您应该更喜欢继承而不是继承来创建特定的项目
Cell
实现。对于常见的单元格结构:
Cell
子类可以是为任何Cell
定义通用方法的Cell
接口,并且您可以具有为其定义通用实现的AbstractCell
类。public interface Cell{
int getValue();
void setValue(int value);
}
public abstract class AbstractCell implements Cell{
...
}
然后,您可以通过扩展
RightCell
来定义LeftCell
和AbstractCell
:public class RightCell extends AbstractCell {
...
}
public class LeftCell extends AbstractCell {
...
}
对于特定于项目的Cell实现:
现在在特定项目中,您可以通过将其与
Cell
实例(最终是Cell
或LeftCell
实例)组成一个自定义RightCell
实现,该实例将用于实现Cell
接口在特定项目的具体课程中。在特定的实现中,您当然可以添加项目所需的任何必需方法。
例如 :
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(){
...
}
}
您可以这样创建
CellProject1
实例:CellProject1 leftCell = new CellProject1(new LeftCell());
CellProject1 rightCell = new CellProject1(new RightCell());
leftCell.draw();
rightCell.draw();
在另一个使用
CellProject2
实例和特定write()
方法的项目中,您可以编写:CellProject2 leftCell = new CellProject2(new LeftCell());
CellProject2 rightCell = new CellProject2(new RightCell());
leftCell.write();
rightCell.write();