【发布时间】:2015-05-19 10:10:52
【问题描述】:
我有一个场景,其中多个具体类extends 多个Abstract 类。我不知道想出一个干净的结构,减少文件的数量,避免代码重复。
要求是根据某些标准以不同的方式显示各种传感器值。温度、电压、电流等传感器值可以有一个模拟小部件、一个数字标签或两者的组合。我有 3 个Abstract 类,用于 3 种不同的视图。这 3 个Abstract 类实现了一个方法,该方法定义了如何绘制视图。每个传感器查看extends 3 个Abstract 类并实现读取传感器、执行一些工程转换和显示传感器值的方法。
这里的问题是,无论它扩展什么Abstract 类,具体类实现的代码都是相同的。 CAnalogTempView、CDigitalTempView 和 CCustomTempView 都有相同的实现,但扩展了不同的类。
这看起来很尴尬。代码重复,源文件的数量增加了 3 倍。我在这里遗漏了一些简单的东西吗?有这样的问题的模式吗?我可以在运行时extends 传感器视图类吗?实际代码更复杂。为了清楚起见,我已经过度简化了问题陈述。
编辑:
有几个传感器视图实现了Abstract 视图类。每个传感器的calculate() 方法是不同的。为简单起见,我刚刚列出了 3 个具体的类。同样,您将拥有CAnalogVoltageView、CDigitalVoltageView、CCustomVoltageView 和CAnalogCurrentView、CDigitalCurrentView、CCustomCurrentView 等等
public abstract class CView
{
public abstract void draw();
public abstract void calculate();
}
public abstract class CAnalogView extends CView
{
public void draw()
{
// draw specific to analog view
}
}
public abstract class CDigitalView extends CView
{
public void draw()
{
// draw specific to digital view
}
}
public abstract class CCustomView extends CView
{
public void draw()
{
// draw specific to custom view
}
}
// concrete implementations
public class CAnalogTempView extends CAnalogView
{
public void calculate()
{
// read and calculate sensor value here
}
}
public class CDigitalTempView extends CDigitalView
{
public void calculate()
{
// calculate here. same as CAnalogTempView::calculate()
}
}
public class CCustomTempView extends CCustomView
{
public void calculate()
{
// calculate here. same as CAnalogTempView::calculate()
}
}
【问题讨论】:
-
你可能过度继承了。这很容易完成。考虑使用委托。
-
在考虑这样的抽象时,您需要做的是考虑“每个函数需要什么才能运行它的个人需求”。也就是说,如果您可以完成所有工作来获取
calculate()可以操作的几个值,那么您应该只获取这些值并传递它们。 -
除了 CANalogTempView 之外,还有更多类扩展 CANalogView 吗?
标签: java multiple-inheritance code-reuse