2016-11-18 2 views
0

У меня есть два класса с кодом, как это (это просто пример)Изменить наследование классов во время выполнения

class parent1 
    function f(param as integer) as integer 
     return param +2 
    end function 
end class 
'=============================== 
class parent2 
    function f(param as integer) as integer 
     return param *1 
    end function 
end class 

тогда я хочу, чтобы создать класс наследуется одного ботинка на основе ситуации во время выполнения. может быть примерно так:

class child 
    sub new(s as string) 
    'it will inherits parent1 
    end sub 
    sub new(i as integer) 
    'it will inherits parent2 
    end sub 
end class 

Возможно ли это?

+1

No. Наследование является то, что выполняется во время компиляции, а не во время выполнения. Могут быть способы выполнить то, что вы хотите, но я боюсь, что это не так. – Blackwood

+0

На самом деле, мы сделали что-то вроде этого. Вы можете испустить ИЛ. См. Этот http://www.drdobbs.com/generating-code-at-run-time-with-reflect/184416570 в качестве примера. –

+0

Похож на проблему [XY] (http://xyproblem.info/). Лучше объясните, что вы на самом деле хотите достичь.Я предполагаю, что [Интерфейсы] (https://msdn.microsoft.com/en-us/library/28e2e18x.aspx) и/или [Делегаты] (https://msdn.microsoft.com/en-us/library/ms172879 .aspx) поможет вам. – Ripple

ответ

0

Множественное наследование невозможно в .Net. Теперь, чтобы решить вашу проблему

  1. Пробуйте генерацию и сборку динамического исходного кода. Вы не можете выполнять множественное наследование, но во время выполнения, когда он уверен, какой тип класса должен быть унаследован, динамически создайте класс, используя CodeDom. Refer msdn link
  2. Этот подход может или не подходит для ваших нужд. Тем не менее, если у вас есть возможность изменить дизайн, используйте interfaces и dependency injection. (Так как имя функции одинаково для обоих классов parent1 и parent2, вы можете воспользоваться polymorphism).
+0

Да .. спасибо, я думаю, что коды - это решения. Можете ли вы рассказать мне, как заменить существующий класс классом, созданным из кодадома ..? Я спрашиваю здесь, но никто не отвечает. http://stackoverflow.com/questions/40713182/vb-net-replace-existing-class-with-codedoms-generated-class –

2

Языки .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 класса

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