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