【问题标题】:Can't implement inheritance when childs have different return types当孩子具有不同的返回类型时无法实现继承
【发布时间】:2013-02-15 17:10:02
【问题描述】:

在图表生成项目中,我有 2 个类。一种称为 BitmapChart,另一种称为 VectorChart。它们的所有属性都是相同的,并且它们具有相同的方法(尽管具有不同的实现)。有一个例外,那就是 Generate() 函数。对于 BitmapChart 对象,它返回一个 Stream,对于 VectorChart 对象,它返回一个 XmlDocument。

起初我认为我应该使用继承,两者都是“图表”,它们共享相同的属性和方法。但后来我意识到,由于返回类型不同,多态是不可能的。

我是否缺少 OO 原则或设计模式来使我的代码更优雅?

【问题讨论】:

    标签: oop design-patterns architecture


    【解决方案1】:

    相同的方法(尽管有不同的实现)。

    为这些方法创建一个接口,如果您希望它们可以互换使用。但是由于Generate() 方法做不同的事情,所以不要将它们包含在界面中。您甚至可能应该将它们命名为不同的名称,即 GenerateStream()GenerateXml()

    对于实现的交集(相同的属性,也可能是方法的一部分),你应该尝试将逻辑和表示分离。所以这对你来说可能是一个更好的方法:

    +--------+        +----------------------+
    | Chart  |        |     <<interface>>    |
    |--------|        |     ChartRenderer    |
    |-data   |        |----------------------|
    |-labels |        |+setChart(Chart chart)|
    |- ...   |        |+...                  |
    +--------+        +----------------------+
                            ^         ^
                            |         |
           +----------------+--+   +--+----------------+
           |BitmapChartRenderer|   |VectorChartRenderer|
           |-------------------|   |-------------------|
           |+generateStream()  |   |+generateXml()     |
           +-------------------+   +-------------------+
    

    【讨论】:

    • 我喜欢这个解决方案,我现在可以平等对待图表,直到呈现。只是出于好奇,这是某种工厂模式吗?
    • 否,但它类似于策略模式。在真正的策略模式中,您将实现一个Chart.render() 方法并将ChartRenderer 实例传递给Chart,但我不会在没有必要的情况下引入这种依赖关系。这个解决方案没有我知道的模式名称,它只是简单的解耦。
    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多