Oop Can';当child具有不同的返回类型时,不能实现继承
在一个图表生成项目中,我有两个类。一个叫做位图图,另一个叫做矢量图。它们的所有属性都是相同的,并且具有相同的方法(尽管实现不同)。有一个例外,那就是Generate()函数。对于位图对象,它返回一个流;对于矢量图对象,它返回一个XmlDocument 起初我认为我应该使用继承,两者都是“图表”,它们共享相同的属性和方法。但后来我意识到多态性是不可能的,因为不同的回报类型 是否有一个OO原则或设计模式让我的代码更加优雅 相同的方法(尽管有不同的实现) 如果您希望能够互换使用这些方法,请为它们创建一个接口。但是由于Oop Can';当child具有不同的返回类型时,不能实现继承,oop,design-patterns,architecture,Oop,Design Patterns,Architecture,在一个图表生成项目中,我有两个类。一个叫做位图图,另一个叫做矢量图。它们的所有属性都是相同的,并且具有相同的方法(尽管实现不同)。有一个例外,那就是Generate()函数。对于位图对象,它返回一个流;对于矢量图对象,它返回一个XmlDocument 起初我认为我应该使用继承,两者都是“图表”,它们共享相同的属性和方法。但后来我意识到多态性是不可能的,因为不同的回报类型 是否有一个OO原则或设计模式让我的代码更加优雅 相同的方法(尽管有不同的实现) 如果您希望能够互换使用这些方法,请为它们创建一
Generate()
方法做了不同的事情,所以不要将它们包含在接口中。您甚至可能应该将它们命名为不同的名称,即GenerateStream()
和GenerateXml()
至于实现的交集(相同的属性,可能还有部分方法),您应该尝试将逻辑和表示分离。因此,这可能是一个更好的方法:
+--------+ +----------------------+
| Chart | | <<interface>> |
|--------| | ChartRenderer |
|-data | |----------------------|
|-labels | |+setChart(Chart chart)|
|- ... | |+... |
+--------+ +----------------------+
^ ^
| |
+----------------+--+ +--+----------------+
|BitmapChartRenderer| |VectorChartRenderer|
|-------------------| |-------------------|
|+generateStream() | |+generateXml() |
+-------------------+ +-------------------+
+----------++----------------------+
|图表| ||
|--------||图表渲染器|
|-数据||----------------------|
|-标签| |+设置图(图表)|
|- ... | |+... |
+--------+ +----------------------+
^ ^
| |
+----------------+--+ +--+----------------+
|位图图表渲染器| |矢量图表渲染器|
|-------------------| |-------------------|
|+generateStream()| |+generateXml()|
+-------------------+ +-------------------+
我喜欢这个解决方案,现在我可以在渲染之前平等地对待图表。只是出于好奇,这是某种工厂模式吗?不是,但它与战略模式类似。在真正的策略模式中,您将实现一个Chart.render()
方法,并将一个chartrender
实例传递给Chart
,但我不会在没有需要的情况下引入这种依赖关系。这个解决方案没有我所知道的模式名称,它只是简单的解耦。