VB.NET-多态性和接口

VB.NET-多态性和接口,.net,vb.net,oop,.net,Vb.net,Oop,我试图理解接口中的多重继承。我从以下网站借用了代码并将其转换为VB.NET: 我不明白IWorker接口的要点是什么,现在有了IWorkable和IFeedable接口(IWorker扩展了IFeedable和IWorkable)。我意识到这与多态性有关,但我不确定。这完全取决于使用对象的代码。这就是它真正“变形”的地方 如果在只需要IWorkable的代码块中使用对象,则该对象将用作IWorkable 如果在只需要IFeedable的代码块中使用对象,则该对象将用作IFeedable 如果该

我试图理解接口中的多重继承。我从以下网站借用了代码并将其转换为VB.NET:


我不明白IWorker接口的要点是什么,现在有了IWorkable和IFeedable接口(IWorker扩展了IFeedable和IWorkable)。我意识到这与多态性有关,但我不确定。

这完全取决于使用对象的代码。这就是它真正“变形”的地方

  • 如果在只需要
    IWorkable
    的代码块中使用对象,则该对象将用作
    IWorkable
  • 如果在只需要
    IFeedable
    的代码块中使用对象,则该对象将用作
    IFeedable
  • 如果该对象在同时需要这两种功能的代码块中使用,则它将用作
    IWorker
    。(为此,您的
    Worker
    类可能应该实现所有三个接口,以便将其用作
    IWorker
主要的一点是,这些代码块都不需要知道或关心它们是在
工人
上操作,还是在
机器人
上操作,或者是在
管理者
上操作


在通用代码中(请参见作为常见示例的),多态性是通过将对象解释为另一种类型来发挥作用的。如果该对象可以变形为该类型(通过接口、继承、任何形式的对象抽象),那么就可以这样使用它。内存中的同一对象可以被解释为它实现的任何时间。

它完全取决于使用该对象的代码。这就是它真正“变形”的地方

  • 如果在只需要
    IWorkable
    的代码块中使用对象,则该对象将用作
    IWorkable
  • 如果在只需要
    IFeedable
    的代码块中使用对象,则该对象将用作
    IFeedable
  • 如果该对象在同时需要这两种功能的代码块中使用,则它将用作
    IWorker
    。(为此,您的
    Worker
    类可能应该实现所有三个接口,以便将其用作
    IWorker
主要的一点是,这些代码块都不需要知道或关心它们是在
工人
上操作,还是在
机器人
上操作,或者是在
管理者
上操作


在通用代码中(请参见作为常见示例的),多态性是通过将对象解释为另一种类型来发挥作用的。如果该对象可以变形为该类型(通过接口、继承、任何形式的对象抽象),那么就可以这样使用它。内存中的同一对象可以解释为它在任何时候实现。

谢谢。在这种情况下,接口中的继承有什么意义?为什么worker类必须实现所有三个接口才能成为IWorker?@w0051977:这样调用代码就可以同时使用
IWorkable
IFeedable
功能,而不必对对象进行两次变形。只有一种类型,
IWorker
,涵盖了所有需要的功能。需要两者的调用代码可以使用
IWorker
,只需要一个的调用代码可以使用该特定代码。要求调用代码对对象进行两次变形通常会很难看,并且更难维护。这是有道理的。您可以使用IWorker接口创建实现IFeedable或IWorkable的对象实例(如果我错了,请更正)。在这种情况下,为什么工人类必须实现所有三个接口?它不能仅仅实现IWorker吗?@w0051977:可能,是的。老实说,我不确定编译器是否足够聪明。当然,您的单元测试会确认这是否有效,对吗?:)我真的很喜欢这个问题/答案,它帮助我很好地理解polyM,但我还有一个问题。许多人认为未来的[可扩展性/可支持性/兼容性]是使用这种方法的一个重要原因(除其他原因外,避免必须[重新编译/重新发布]整个代码行)。有人能举个例子(在这里或在另一个答案中)说明这是如何工作的吗?比如说,在稍后的某个时间点上,该工作者需要是“可睡眠的”,或者类似的对扩展功能的有效请求。除非我误解了什么,谢谢。在这种情况下,接口中的继承有什么意义?为什么worker类必须实现所有三个接口才能成为IWorker?@w0051977:这样调用代码就可以同时使用
IWorkable
IFeedable
功能,而不必对对象进行两次变形。只有一种类型,
IWorker
,涵盖了所有需要的功能。需要两者的调用代码可以使用
IWorker
,只需要一个的调用代码可以使用该特定代码。要求调用代码对对象进行两次变形通常会很难看,并且更难维护。这是有道理的。您可以使用IWorker接口创建实现IFeedable或IWorkable的对象实例(如果我错了,请更正)。在这种情况下,为什么工人类必须实现所有三个接口?它不能仅仅实现IWorker吗?@w0051977:可能,是的。老实说,我不确定编译器是否足够聪明。当然,您的单元测试会确认这是否有效,对吗?:)我真的很喜欢这个问题/答案,它帮助我很好地理解polyM,但我还有一个问题。许多人认为未来的[可扩展性/可支持性/兼容性]是使用这种方法的一个重要原因(除其他原因外,避免必须[重新编译/重新发布]整个代码行)。有人能举个例子吗(在这里或在另一个answ中)
Public Interface IWorker
    Inherits IFeedable, IWorkable
End Interface

Public Interface IWorkable
    Sub work()
End Interface

Public Interface IFeedable
    Sub eat()
End Interface

Public Class Worker
    Implements IWorkable, IFeedable
    Public Sub eat() Implements IFeedable.eat

    End Sub

    Public Sub work() Implements IWorkable.work

    End Sub
End Class

Public Class Robot
    Implements IWorkable

    Public Sub work() Implements IWorkable.work

    End Sub
End Class

Class Manager
    Dim worker As IWorkable

    Public Sub setWorker(ByVal w As IWorkable)
        worker = w
    End Sub

    Public Sub manage()
        worker.work()
    End Sub
End Class

Public Class Form1
       Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                Dim Test As New Manager
                Dim IWorkerRobot As IWorkable = New Robot
                Test.setWorker(IWorkerRobot)

            Catch ex As Exception
                'I won't absorb the exception.  
            End Try
        End Sub
    End Class