2016-08-19 6 views
2

Прежде всего mixins - не лучшее решение, так как мои интерфейсы большие, и я хочу избежать написания пустых реализаций.Правильный подход, когда требуется множественное наследование (TypeScript)

Я ищу, какой подход (техника) является лучшим для множественного наследования. Мои проблемы - наследование алмазов (да, я читал о проблеме с алмазами).

//     ----------------------- 
//     |   Edit  | 
//     ----------------------- 
//    /    \ 
//    /     \ 
//    /     \ 
// -----------------------   ----------------------- 
// |  DataSetEdit  |   |  OEdit  | 
// -----------------------   ----------------------- 
//     \     /
//      \    /
//      \    /
//     ----------------------- 
//     |  ODataSetEdit | 
//     ----------------------- 

Логика проста.

  • Edit является basicaly некоторые <input type="textbox"> с некоторыми дополнительный метод проверки, маски, входной контроль ...
  • OEdit расширяет редактировать некоторые дополнительные методы для укладки. Может получать свойства из серверного приложения (WebSocket), отправлять события на сервер
  • DataSetEdit добавляет методы и свойства для обработки свойств редактирования (текст, цвет, подпись, заполнитель ...) - автоматически обрабатывает изменения при изменении текущей записи. (DataSet - это класс, а его данные - Object [].)
  • ODataSetEdit расширяет функциональность OEdit, но для обработки изменений в DataSet также необходимы методы DataSetEdit.

В одном проекте я использую DataSetEdit, а в другом я всегда использую ODataSetEdit. Поэтому в проекте, где используется ODataSetEdit, мне нужно только скопировать функции DataSetEdit.

Я не хочу дублировать код в DataSetEdit и ODataSetEdit. Я думаю, если я могу решить эту проблему с:

  • некоторые статические методы/свойства приближаются
  • декораторов (возможно, на конструктор для расширения функциональных возможностей класса)
  • некоторые статический метод на DataSetEdit который будет вызываться из ODataSetEdit расширить функциональные возможности OEdit с DataSetEdit
  • методов прокси и свойствам от ODataSetEdit к DataSetEdit
  • какой-то composition (как бы дизайн выглядит в этом конкретном примере)

ODataSetEdit должен расширять OEdit, но иметь возможность использовать функциональные возможности, добавленные в DataSetEdit.

Я думаю, что структура класса логична, как я могу избежать необходимости множественного наследования в моем дизайне? Я уверен, что это распространенная проблема, не связанная с TypeScript.

ответ

3

, как я могу избежать необходимости множественного наследования в моей конструкции

Подведите логики из OEdit в функции/переменные (не стесняйтесь использовать пространство имен: https://basarat.gitbooks.io/typescript/content/docs/project/namespaces.html, чтобы собрать их в нечто значимое) и затем обменивайтесь ими между OEdit и ODataSetEdit.

Больше

Фундаментально вам нужно переместить логику из в месте, доступном по меньшей мере, одного прямого потомка и великого ребенка. Нет двух путей.

+1

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

+0

Согласитесь, также купите и прочитайте несколько книг об этом, но примеры в книгах - это основные для меня, чтобы передать его моему коду. – Makla