我应该如何构造一个由带有子接口的实现者组成的类层次结构?

时间:2019-06-12 23:56:16

标签: oop inheritance architecture

我致力于开发需要大量输入然后自动设计机器的软件。现在,我正在构建一个报告系统,该报告系统提供有关此机器的性能,构造和设计的复杂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而言,这东西适合什么样的关系。有什么想法吗?

1 个答案:

答案 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();
}

这实现了我想要的。我认为问题标题仍然有意义。只是答案比我想的要简单得多。