我在设置代码结构时遇到了困难。在一个项目中,我有两个类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
为:
ip link set wlan0 down
取决于我正在运行的项目。我玩弄仿制药,但无法让它发挥作用。欢迎所有建议!
答案 0 :(得分:0)
问题在于我还想为这些对象(特别是Cell对象)添加额外的功能,这些功能因项目而异。
我建议创建Cell
实现的接口,允许其子类实现所需的方法,尤其是Cell
是抽象类时。
public interface Features {
...
}
public abstract class Cell implements Features {
...
}
答案 1 :(得分:0)
问题在于我创建的任何LeftCell / RightCell对象 当然无法访问这个draw()方法。
当然不能在不知道它的父实例上调用特定于子类的方法。
由于您的要求是
继承层次结构更改以减少代码重复 在一个项目中,我有两个类LeftCell和RightCell,两个 扩展类Cell。 现在,为了避免代码重复,我想在其中使用这些对象 多个其他项目
我认为你应该让事情有所不同。
如果您想避免爆发类别组合的数量,而不是像示例中那样重复LeftCell
和RightCell
:
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
来定义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();