Языки .NET не поддерживают множественное наследование, и вы не можете изменить его во время выполнения, как указано во всех полученных комментариях.
Вместо этого было создано «обходное решение» для этой проблемы, называемой интерфейсом. Кто-то назвал это «взломанным» решением :)
Для меня ваша проблема - проблема для инъекции зависимостей.
Вы хотите иметь класс child
, который может изменять поведение во время выполнения.
Создание абстракции поведения, вы хотите изменить, как интерфейс
Public Interface IBehavior
Function Calculate(value As Integer) As Integer
End Interface
Затем создайте child
класс, который принимает поведение в качестве параметра конструктора
Public Class Child
Private ReadOnly _behavior As IBehavior
Public Sub New(behavior As IBehavior)
_behavior = behavior
End Sub
Public Sub Execute(int value)
Dim newValue As Integer = _behavior.Calculate(value)
' Do something else
End Sub
End Class
Создание реализаций IBehavior
вы хотите использовать во время выполнения
Public Class SumBehavior Implements IBehavior
Function Calculate(value As Integer) As Integer Implements IBehavior.Calculate
Return value + 2
End Function
End Class
Public Class MultiplyBehavior Implements IBehavior
Function Calculate(value As Integer) As Integer Implements IBehavior.Calculate
Return value * 2
End Function
End Class
Тогда во время работы вы можете изменить поведение Child
экземпляра на основе переданного параметра
Dim sum As New SumBehavior()
Dim child As New Child(sum)
child.Execute(23)
Вашей проблемы хороший пример «Open-Close Принципа».
- Ваш Child
класс закрыт для модификаций ->Do something else
сотрудников Execute
методы остается неизмененной
- Ваш child
класса открыт для модификаций ->Behavior
логики может быть изменена без касания Child
класса
No. Наследование является то, что выполняется во время компиляции, а не во время выполнения. Могут быть способы выполнить то, что вы хотите, но я боюсь, что это не так. – Blackwood
На самом деле, мы сделали что-то вроде этого. Вы можете испустить ИЛ. См. Этот http://www.drdobbs.com/generating-code-at-run-time-with-reflect/184416570 в качестве примера. –
Похож на проблему [XY] (http://xyproblem.info/). Лучше объясните, что вы на самом деле хотите достичь.Я предполагаю, что [Интерфейсы] (https://msdn.microsoft.com/en-us/library/28e2e18x.aspx) и/или [Делегаты] (https://msdn.microsoft.com/en-us/library/ms172879 .aspx) поможет вам. – Ripple