Пример того, как наш продукт использует классы mixin, предназначен для сохранения и восстановления конфигурации. Существует абстрактный класс mixin, который определяет набор чистых виртуальных методов. Любой класс, который можно сохранить, наследует класс сохранения/восстановления mixin, который автоматически предоставляет им соответствующие функции сохранения/восстановления.
Этот пример на самом деле не иллюстрирует полезность множественного наследования. Здесь определяется ИНТЕРФЕЙС. Множественное наследование позволяет также наследовать поведение. Какая точка миксинов.
Пример; из-за необходимости сохранения обратной совместимости я должен реализовать свои собственные методы сериализации.
Таким образом, каждый объект получает способ чтения и хранения, подобный этому.
Public Sub Store(ByVal File As IBinaryWriter)
Public Sub Read(ByVal File As IBinaryReader)
Я также хочу, чтобы иметь возможность назначать и клонировать объект. Поэтому я хотел бы это сделать на каждом объекте.
Public Sub Assign(ByVal tObject As <Class_Name>)
Public Function Clone() As <Class_Name>
Сейчас в VB6 У меня этот код повторяется снова и снова.
Public Assign(ByVal tObject As ObjectClass)
Me.State = tObject.State
End Sub
Public Function Clone() As ObjectClass
Dim O As ObjectClass
Set O = New ObjectClass
O.State = Me.State
Set Clone = 0
End Function
Public Property Get State() As Variant
StateManager.Clear
Me.Store StateManager
State = StateManager.Data
End Property
Public Property Let State(ByVal RHS As Variant)
StateManager.Data = RHS
Me.Read StateManager
End Property
Обратите внимание, что Statemanager - это поток, который считывает и сохраняет байтовые массивы.
Этот код повторяется десятки раз.
Теперь в .NET я могу обойти это, используя комбинацию дженериков и наследования. Мой объект под версией .NET получает Assign, Clone и State, когда они наследуют MyAppBaseObject. Но мне не нравится тот факт, что каждый объект наследуется от MyAppBaseObject.
Я скорее просто смешиваю в интерфейсе Assign Clone AND BEHAVIOR. Лучше всего смешивать отдельно интерфейс чтения и хранения, а затем смешивать в Assign и Clone. На мой взгляд, это был бы чистый код.
Но времена, когда я использую поведение DWARFED, я использую интерфейс. Это связано с тем, что целью большинства иерархий объектов НЕ является повторное использование поведения, но точное определение взаимосвязи между различными объектами. Для каких интерфейсов предназначены. Поэтому, хотя было бы неплохо, что у C# (или VB.NET) была какая-то возможность сделать это, по моему мнению, это не пробная пробка.
Вся причина, по которой это даже проблема, что C++ пошатнул шар сначала, когда дело касалось проблемы с интерфейсом и наследованием. Когда ООП дебютировал, все считали, что повторное использование поведения является приоритетом. Но это оказалось химерой и полезно только для конкретных обстоятельств, например, для создания пользовательского интерфейса.
Позже была разработана идея миксинов (и других связанных с ними понятий в аспекте программирования). Множественное наследование было сочтено полезным при создании микширования. Но C# был разработан как раз до того, как это было широко признано. Вероятно, для этого будет разработан альтернативный синтаксис.
Это ответ на ваш вопрос?Если да, примите ответ. (Подсказка: +12 ответ может быть ответом) – 2010-01-03 12:31:46