1

我试图理解接口中的多重继承。我从以下网站借用了代码并将其转换为VB.NET:http://www.oodesign.com/interface-segregation-principle.html

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

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

4

1 回答 1

1

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

  • 如果该对象在只需要 an 的代码块中使用,IWorkable那么它将用作IWorkable.
  • 如果该对象在只需要 an 的代码块中使用,IFeedable那么它将用作IFeedable.
  • 如果对象在需要两者的代码块中使用,那么它将用作IWorker. (为此,您的Worker类可能应该实现所有三个接口,以便可以将其用作IWorker.)

要点是,这些代码块都不需要知道或关心它们是在 aWorker还是 aRobot或 a上运行Manager

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

于 2012-07-08T14:28:50.153 回答