1

インターフェイスの多重継承を理解しようとしています。次の Web サイトからコードを借用し、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 を拡張したもの) が存在するため、IWorker インターフェイスのポイントが何であるかがわかりません。これはポリモーフィズムと関係があることはわかっていますが、よくわかりません。

4

1 に答える 1

1

オブジェクトを使用しているコードに完全に依存します。それが実際に「ポリモーフィング」される場所です。

  • のみを必要とするコード ブロックでオブジェクトが使用されている場合、オブジェクトは として使用さIWorkableれますIWorkable
  • のみを必要とするコード ブロックでオブジェクトが使用されている場合、オブジェクトは として使用さIFeedableれますIFeedable
  • オブジェクトが両方を必要とするコードのブロックで使用されている場合、それは として使用されますIWorker。(そのために、Workerクラスはおそらく 3 つのインターフェースすべてを実装して、 として使用できるようにする必要がありますIWorker。)

重要な点は、これらのコード ブロックはいずれもWorker、 、 、または で動作しているかどうかを認識したり気にしたりする必要がないということRobotですManager

一般化されたコード (一般的な例として戦略パターンを参照) では、オブジェクトを別の型として解釈することでポリモーフィズムが機能します。そのオブジェクトがその型に (インターフェイス、継承、任意の形式のオブジェクト抽象化を通じて) ポリモーフできる場合は、そのまま使用できます。メモリ内の同じオブジェクトは、実装するたびに解釈できます。

于 2012-07-08T14:28:50.153 に答える