在运行时更改继承类

时间:2016-11-18 00:12:32

标签: vb.net

我有两个类这样的代码(这只是示例)

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

有可能......?

2 个答案:

答案 0 :(得分:2)

.NET语言不支持多继承,并且您无法在运行时更改它,如您收到的所有评论中所指出的那样 相反,为这个名为Interface的问题创建了很好的“解决方法”。有人称之为“黑客”解决方案:)

对我来说,你的问题是依赖注入的问题。

您希望拥有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)

你的问题是“开放式原则”的好例子   - 您的Child课程因修改而关闭 - > Do something else方法的Execute名工作人员未经修改   - 您的child课程已开放进行修改 - > Behavior逻辑可以在不触及Child

的情况下进行更改

答案 1 :(得分:0)

.Net中无法进行多重继承。现在,解决你的问题

  1. 尝试动态源代码生成和编译。您不能进行多重继承,但在运行时确定必须继承哪种类型的类时,使用CodeDom动态创建类。请参阅msdn link
  2. 这种方法可能适合您的需要,也可能不适合您。如果您有更改设计的余地,请使用interfacesdependency injection。 (由于类parent1parent2中的函数名称相同,因此您可以利用polymorphism)。