继承层次结构更改以减少代码重复

时间:2017-05-03 19:31:37

标签: java generics inheritance hierarchy

我在设置代码结构时遇到了困难。在一个项目中,我有两个类RightCellCell,两个类都扩展了类Cell。现在,为了避免代码重复,我想在多个其他项目中使用这些对象。问题是我还想为这些对象(特别是Cell对象)添加额外的功能,这些对象因项目而异。

假设我创建了一个新项目,我想在其中使用void draw()方法可视化CellProject1个对象。我的第一个想法是创建一个新的Cell类,扩展draw()类并包含class CellProject1 extends Cell { void draw() {} } 方法:

LeftCell

问题是我创建的任何RightCell / draw()个对象当然无法访问此Cell方法。我想我想以某种方式挤压类层次结构中的Cell LeftCell RightCell 子类,使其从以下位置更改:

Cell
    CellProjectX
        LeftCell
        RightCell

为:

ip link set wlan0 down

取决于我正在运行的项目。我玩弄仿制药,但无法让它发挥作用。欢迎所有建议!

2 个答案:

答案 0 :(得分:0)

  

问题在于我还想为这些对象(特别是Cell对象)添加额外的功能,这些功能因项目而异。

我建议创建Cell实现的接口,允许其子类实现所需的方法,尤其是Cell是抽象类时。

public interface Features {
    ...
}

public abstract class Cell implements Features {
    ...
}

答案 1 :(得分:0)

  

问题在于我创建的任何LeftCell / RightCell对象   当然无法访问这个draw()方法。

当然不能在不知道它的父实例上调用特定于子类的方法。

由于您的要求是

  

继承层次结构更改以减少代码重复   在一个项目中,我有两个类LeftCell和RightCell,两个   扩展类Cell。   现在,为了避免代码重复,我想在其中使用这些对象   多个其他项目

我认为你应该让事情有所不同。

如果您想避免爆发类别组合的数量,而不是像示例中那样重复LeftCellRightCell

Cell
    CellProjectX
        LeftCell
        RightCell

最终可以通过以下方式完成:

Cell
    CellProjectY
        LeftCell
        RightCell

Cell
    CellProjectZ
        LeftCell
        RightCell

您应该优先考虑继承的构成,以创建特定的项目Cell实现。

对于常见的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();