2013-02-15 3 views
2

В проекте генерации диаграммы у меня есть 2 класса. Один из них называется BitmapChart, а другой называется VectorChart. Все их свойства одинаковы, и они имеют одинаковые методы (с разными реализациями). Существует одно исключение, и это функция Generate(). В случае объекта BitmapChart он возвращает Stream, а в случае объекта VectorChart возвращает XmlDocument.Невозможно реализовать наследование, когда у детей есть разные типы возврата

Сначала мне показалось, что я должен использовать Inheritance, оба являются «Charts», и они имеют одни и те же свойства и методы. Но тогда я понял, что полиморфизм невозможен из-за разных типов возврата.

Есть ли принцип OO или шаблон дизайна, который мне не хватает, чтобы сделать мой код более элегантным?

ответ

1

те же методы (с различными реализациями, хотя).

Создать интерфейс для этих методов, если вы хотите, чтобы иметь возможность использовать их взаимозаменяемыми. Но поскольку методы Generate() делают разные вещи, не включайте их в интерфейс. Вы, вероятно, даже должны называть их разными, то есть GenerateStream() и GenerateXml()

Что касается пересечения реализации (такие же свойства и, возможно, части методов), вы должны попытаться отделить логику и презентацию. Таким образом, это может быть лучшим подходом для вас:

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

Мне нравится это решение, теперь я могу рассматривать диаграмму одинаково до рендеринга. Просто из любопытства, это какой-то заводской шаблон? – BBQ

+1

Нет, но это похоже на шаблон стратегии. В реальном шаблоне стратегии вы должны реализовать метод Chart.render() и передать экземпляр «ChartRenderer» в «Chart», но я бы не стал вводить эту зависимость без необходимости. Это решение не имеет имени паттерна, которое я знаю, это просто развязка. –

Смежные вопросы