继承层次结构改变以减少代码重复
Inheritance hierarchy altering to reduce code duplication
我在设置代码结构时遇到困难。在一个项目中,我有两个 classes LeftCell
和 RightCell
,它们都扩展了 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 的可能组合数量而不像你的例子那样重复 LeftCell
和 RightCell
:
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{
...
}
然后你可以定义 RightCell
和 LeftCell
通过扩展 AbstractCell
:
public class RightCell extends AbstractCell {
...
}
public class LeftCell extends AbstractCell {
...
}
对于项目特定的 Cell 实现:
现在,在特定项目中,您可以通过将其与 Cell
实例(最后是 LeftCell
或 RightCell
实例)组合来创建自定义 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();
我在设置代码结构时遇到困难。在一个项目中,我有两个 classes LeftCell
和 RightCell
,它们都扩展了 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 的可能组合数量而不像你的例子那样重复 LeftCell
和 RightCell
:
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{
...
}
然后你可以定义 RightCell
和 LeftCell
通过扩展 AbstractCell
:
public class RightCell extends AbstractCell {
...
}
public class LeftCell extends AbstractCell {
...
}
对于项目特定的 Cell 实现:
现在,在特定项目中,您可以通过将其与 Cell
实例(最后是 LeftCell
或 RightCell
实例)组合来创建自定义 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();