我在设置代码结构时遇到困难。在一个项目中,我有两个类LeftCellRightCell,它们都扩展了类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。
现在,为了避免代码重复,我想在
其他多个项目


我认为您应该使事情有所不同。

如果要避免爆炸可能的类组合数量,而不要像示例中那样复制LeftCellRightCell

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来定义LeftCellAbstractCell

public class RightCell extends AbstractCell {
      ...
}

public class LeftCell extends AbstractCell {
      ...
}


对于特定于项目的Cell实现:

现在在特定项目中,您可以通过将其与Cell实例(最终是CellLeftCell实例)组成一个自定义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();

09-13 10:24