Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Can';当child具有不同的返回类型时,不能实现继承_Oop_Design Patterns_Architecture - Fatal编程技术网

Oop Can';当child具有不同的返回类型时,不能实现继承

Oop Can';当child具有不同的返回类型时,不能实现继承,oop,design-patterns,architecture,Oop,Design Patterns,Architecture,在一个图表生成项目中,我有两个类。一个叫做位图图,另一个叫做矢量图。它们的所有属性都是相同的,并且具有相同的方法(尽管实现不同)。有一个例外,那就是Generate()函数。对于位图对象,它返回一个流;对于矢量图对象,它返回一个XmlDocument 起初我认为我应该使用继承,两者都是“图表”,它们共享相同的属性和方法。但后来我意识到多态性是不可能的,因为不同的回报类型 是否有一个OO原则或设计模式让我的代码更加优雅 相同的方法(尽管有不同的实现) 如果您希望能够互换使用这些方法,请为它们创建一

在一个图表生成项目中,我有两个类。一个叫做位图图,另一个叫做矢量图。它们的所有属性都是相同的,并且具有相同的方法(尽管实现不同)。有一个例外,那就是Generate()函数。对于位图对象,它返回一个流;对于矢量图对象,它返回一个XmlDocument

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

是否有一个OO原则或设计模式让我的代码更加优雅

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

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

至于实现的交集(相同的属性,可能还有部分方法),您应该尝试将逻辑和表示分离。因此,这可能是一个更好的方法:

+--------+        +----------------------+
| Chart  |        |     <<interface>>    |
|--------|        |     ChartRenderer    |
|-data   |        |----------------------|
|-labels |        |+setChart(Chart chart)|
|- ...   |        |+...                  |
+--------+        +----------------------+
                        ^         ^
                        |         |
       +----------------+--+   +--+----------------+
       |BitmapChartRenderer|   |VectorChartRenderer|
       |-------------------|   |-------------------|
       |+generateStream()  |   |+generateXml()     |
       +-------------------+   +-------------------+
+----------++----------------------+
|图表| ||
|--------||图表渲染器|
|-数据||----------------------|
|-标签| |+设置图(图表)|
|- ...   |        |+...                  |
+--------+        +----------------------+
^         ^
|         |
+----------------+--+   +--+----------------+
|位图图表渲染器| |矢量图表渲染器|
|-------------------|   |-------------------|
|+generateStream()| |+generateXml()|
+-------------------+   +-------------------+

我喜欢这个解决方案,现在我可以在渲染之前平等地对待图表。只是出于好奇,这是某种工厂模式吗?不是,但它与战略模式类似。在真正的策略模式中,您将实现一个
Chart.render()
方法,并将一个
chartrender
实例传递给
Chart
,但我不会在没有需要的情况下引入这种依赖关系。这个解决方案没有我所知道的模式名称,它只是简单的解耦。