Прежде всего 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.
Кроме того, несколько уровней наследования часто являются большим запахом дизайна и опасностью обслуживания, поэтому переход к меньшим абстракциям (функциям) является большой победой. – AlexG
Согласитесь, также купите и прочитайте несколько книг об этом, но примеры в книгах - это основные для меня, чтобы передать его моему коду. – Makla