2017-05-03 45 views
3

设置我的代码结构时遇到困难。在一个项目中,我有两个类LeftCellRightCell,这两个类都扩展了Cell。现在,为了避免代码重复,我想在其他多个项目中使用这些对象。问题是我也想为这些对象添加额外的功能(特别是Cell对象),每个项目都有所不同。继承层次结构更改以减少代码重复

假设我创建了一个新项目,我想用void draw()方法将Cell对象可视化。我首先想到的是要建立一个新的CellProject1类,它扩展了Cell类,并包括draw()方法:

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

的问题是,任何LeftCell/RightCell对象创建,也当然不能访问这个draw()方法。我想我要以某种方式挤Cell子类的类层次结构,使得它的变化:

Cell 
    LeftCell 
    RightCell 

到:这取决于我运行的项目

Cell 
    CellProjectX 
     LeftCell 
     RightCell 

。我玩过泛型,但无法实现。欢迎所有建议!

回答

0

的问题是,我创造的任何LeftCell/RightCell对象,请 当然无法获得这场平局()方法。

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

由于您的要求是

继承层次改变,以减少代码的重复 在一个项目中,我有两个类LeftCell和RightCell,既 扩展类细胞。 现在,为了避免代码重复,我想在 多个其他项目

我认为你应该做的事情有点不同使用这些对象。

如果你想避免爆炸的组合可能的班,而不是复制LeftCellRightCell就像你的例子数量:

Cell 
    CellProjectX 
     LeftCell 
     RightCell 

可能由最终完成:

Cell 
    CellProjectY 
     LeftCell 
     RightCell 

Cell 
    CellProjectZ 
     LeftCell 
     RightCell 

你应该赞成继承的构成来创建你的特定项目实现。

对于常见的细胞结构:

Cell子类可以是一个Cell接口定义任何Cell常用的方法,你可以有一个AbstractCell类,定义了它常见的实现。

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


public abstract class AbstractCell implements Cell{ 
     ... 
} 

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

public class RightCell extends AbstractCell { 
     ... 
} 

public class LeftCell extends AbstractCell { 
     ... 
} 

有关具体到一个项目的小区实现:

现在,在一个特定的项目,你可以一个创建通过将其与Cell实例(最后是LeftCell或)组合来实现自定义Cell实现实例),它将在特定项目具体类中用于实现接口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(); 
0

问题是我还想为这些对象(特别是Cell对象)添加额外的功能,这些对象每个项目都不相同。

我建议创建一个接口,Cell工具,允许它的子类来实现你想要的方式,特别是如果Cell是一个抽象类。

public interface Features { 
    ... 
} 

public abstract class Cell implements Features { 
    ... 
}