2012-07-08 56 views
1

我想了解接口中的多重繼承。我從以下網站借來的代碼並將其轉化到VB.NET:http://www.oodesign.com/interface-segregation-principle.htmlVB.NET - 多態和接口

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)。我意識到這與多態性有關,但我不確定。

+0

在片段中定義IWorker沒有意義,因爲您不使用它。任意延伸機器人的定義,它也必須吃。就像一個完全不同於人類的方式,它將不得不將自己插入牆上的插座來爲其電池充電。 – 2012-07-08 14:51:22

+0

@Hans Passant,它何時有繼承層次? – w0051977 2012-07-08 14:55:33

+0

當你在類之間有** is-a **關係時。經理不是機器人,在你的片段中沒有證據。但是這適用於類,而不是接口。您的IWorker只是聲明一個接口,允許使用該接口的客戶端請求進食和工作。 – 2012-07-08 15:03:22

回答

1

它完全取決於使用該對象的代碼。這就是它真正得到「多元化」的地方。

  • 如果該對象在一個代碼塊,僅需要一個IWorkable那麼它將被用作IWorkable被使用。
  • 如果該對象正在一個只需要IFeedable的代碼塊中使用,那麼它將用作IFeedable
  • 如果該對象正在用於需要這兩個的代碼塊中,那麼它將用作IWorker。 (爲此,您Worker類應該可能實現所有三個接口,因此它可以被用作IWorker。)

主要的一點是,這些代碼塊的沒有需要知道或關心他們是否重新操作WorkerRobotManager

在通用代碼中(參見Strategy Pattern作爲常見示例),多態性通過將對象解釋爲另一種類型而發揮作用。如果該對象可以多態化爲該類型(通過接口,繼承,任何形式的對象抽象),那麼它可以被使用。內存中的同一個對象可以被解釋爲它實現的任何時候。

+0

謝謝。在那種情況下,接口中的繼承點是什麼?爲什麼工人類必須將所有三個接口都實現爲IWorker? – w0051977 2012-07-08 14:34:15

+0

@ w0051977:因此,調用代碼可以同時使用'IWorkable'和'IFeedable'功能,而不必對對象進行兩次變形。單一類型「IWorker」涵蓋了所有需要的功能。調用需要兩者的代碼可以使用'IWorker',調用只需要一個的代碼就可以使用那個特定的代碼。要求調用代碼將對象變形兩次通常會很難看,而且難以維護。 – David 2012-07-08 14:35:56

+0

這確實有道理。您可以使用IWorker接口並創建一個實現IFeedable或IWorkable的對象的實例(如果我錯了,請糾正我)。在那種情況下,爲什麼Worker類必須實現所有三個接口?難道它不只是實現IWorker? – w0051977 2012-07-08 14:39:18