我致力于开发需要大量输入然后自动设计机器的软件。现在,我正在构建一个报告系统,该报告系统提供有关此机器的性能,构造和设计的复杂pdf报告。该机械具有许多不同的零件,这些零件具有许多标准类型(例如:零件是“ Engine”,给定的子类型可以是“ 2 Cylinder”);设计都是参数化的,并且子类型足够不同,因此值得拥有自己的类。所有这些部分都有尺寸测量值,我必须提供IP和SI单位的报告。我需要有关如何构造有意义的类层次结构的想法,并且在我将要编写的其余代码中易于使用。关键在于单位转换。 Engine的某些部分是通用的,无论子类如何,它们始终存在并且以相同的方式实现,因此它需要转换方法,而其他字段则不是通用的,因此基类也需要转换方法。
让我们来看一下引擎示例。这就像我现在所拥有的。我有一个代表引擎的基本抽象类,实现了一个IConvertible
接口,这意味着该部件可以从IP单元转换为SI单元。子类TwoCylinderEngine
继承自Engine,并且覆盖了Engine类的Conversion方法,但并未实现IConvertible
本身。我应该提到我有一个Measurement Unit来处理单位转换,因此该部分的实现与我的问题无关。
public abstract class Engine : IConvertible {
Measurement someMeasurement;
public void ConvertToIP(){
BaseConvertToIP();
}
public void ConvertToSI(){
BaseConvertToSI();
}
public void BaseConvertToIP(){
someMeasurement = someMeasurement.ConvertTo("some IP Unit");
}
public void BaseConvertToSI(){
someMeasurement = someMeasurement.ConvertTo("some SI Unit");
}
}
public class TwoCylinderEngine: Engine{
Measurement someOtherMeasurement;
public override void ConvertToIP(){
BaseConvertToIP();
someOtherMeasurement = someOtherMeasurement.ConvertTo("some IP Unit");
}
public override void ConvertToSI(){
BaseConvertToSI();
someOtherMeasurement = someOtherMeasurement.ConvertTo("some SI Unit");
}
}
public interface IConvertible
{
void ConvertToIP();
void ConvertToSI();
void BaseConvertToIP();
void BaseConvertToSI();
}
此结构对我来说效果很好,但是我对公开BaseConvertToIP()
和BaseConvertToSI()
的需求感到不满意。我希望有一种方法可以在这种情况下声明受保护的接口方法,但是我知道这与接口的初衷是相违背的。我不确定就OOP而言,这东西适合什么样的关系。有什么想法吗?
答案 0 :(得分:0)
首先道歉。我以为我已经尝试过了,但是似乎没有。我遇到的问题是BaseConvertTo
方法的公共性质,我不喜欢。解决的办法是完全不使用那些方法。相反,仅在基类中具有虚拟ConvertTo
方法,然后可以在派生类中使用base.ConvertTo
调用这些方法。这解决了我在类层次结构中遇到的一个问题。
public abstract class Engine : IConvertible {
Measurement someMeasurement;
public virtual void ConvertToIP(){
someMeasurement.ConvertTo("Some IP Unit");
}
public virtual void ConvertToSI(){
someMeasurement.ConvertTo("Some SI Unit");
}
}
public class TwoCylinderEngine: Engine{
Measurement someOtherMeasurement;
public override void ConvertToIP(){
base.ConvertToIP();
someOtherMeasurement = someOtherMeasurement.ConvertTo("some IP Unit");
}
public override void ConvertToSI(){
base.ConvertToSI();
someOtherMeasurement = someOtherMeasurement.ConvertTo("some SI Unit");
}
}
public interface IConvertible
{
void ConvertToIP();
void ConvertToSI();
}
这实现了我想要的。我认为问题标题仍然有意义。只是答案比我想的要简单得多。