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

Inheritance hierarchy altering to reduce code duplication

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

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

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

问题是我创建的任何 LeftCell/RightCell 对象当然无法访问此 draw() 方法。我想我想以某种方式在 class 层次结构中压缩一个 Cell subclass,使其从:

Cell
    LeftCell
    RightCell

至:

Cell
    CellProjectX
        LeftCell
        RightCell

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

The problem is that I also want to add extra functionalities to these objects (the Cell object in particular), which differ per project.

我建议创建一个 Cell 实现的接口,允许它的子 class 实现你想要的方法,特别是如果 Cell 是一个抽象 class .

public interface Features {
    ...
}

public abstract class Cell implements Features {
    ...
}

The problem is that any LeftCell/RightCell objects I create, do of course not have access to this draw() method.

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

因为你的要求是

Inheritance hierarchy altering to reduce code duplication In one project, I have two classes LeftCell and RightCell, both extending class Cell. Now, to avoid code duplication, I want to use these objects in multiple other projects

我认为你应该做一些不同的事情。

如果你想避免爆炸 classes 的可能组合数量而不像你的例子那样重复 LeftCellRightCell :

Cell
    CellProjectX
        LeftCell
        RightCell

最终可以完成:

Cell
    CellProjectY
        LeftCell
        RightCell

Cell
    CellProjectZ
        LeftCell
        RightCell

你应该更喜欢组合而不是继承来创建你的特定项目Cell实现。

常见的Cell结构:

Cell subclass 可以是一个 Cell 接口,它为任何 Cell 定义通用方法,你可以有一个 AbstractCell class 定义了它的通用实现。

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


public abstract class AbstractCell implements Cell{
      ...
}

然后你可以定义 RightCellLeftCell 通过扩展 AbstractCell :

public class RightCell extends AbstractCell {
      ...
}

public class LeftCell extends AbstractCell {
      ...
}

对于项目特定的 Cell 实现:

现在,在特定项目中,您可以通过将其与 Cell 实例(最后是 LeftCellRightCell 实例)组合来创建自定义 Cell 实现将在引擎盖下用于在特定项目具体 class.
中实现 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();

并且在另一个使用具有特定 write() 方法的 CellProject2 实例的项目中,您可以编写:

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