2012-07-08 3 views
1

인터페이스에서 다중 상속을 이해하려고합니다. 내가 VB.NET에 다음 웹 사이트에서 코드를 빌려 변환 한 : 나는 IWorker 인터페이스의 포인트는 IWorkable 및 IFeedable 인터페이스가 있다는 것을 지금 무엇을 이해하지 못하는 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를 확장 IFeedable 및 IWorkable). 나는 이것이 다형성과 관련이있을 것이라고 확신하지만 잘 모르겠습니다.

+0

코드 단편에서 IWorker를 정의하지 않는 이유는 단순히 사용하지 않기 때문입니다. 로봇의 정의를 임의로 확장하면 먹을 수도 있습니다. 예를 들어 인간과 완전히 다른 방식으로 배터리를 충전하려면 벽 소켓에 플러그를 꽂아야합니다. –

+0

@ 한스 패전트, 상속 계층 구조가 유효한 것은 언제입니까? – w0051977

+0

클래스 사이에 ** is-a ** 관계가있을 때. 매니저가 로봇이 아니라는 증거가 없습니다. 그러나 이것은 인터페이스가 아닌 클래스에 적용됩니다. IWorker는 인터페이스를 사용하는 클라이언트가 먹고 일하는 것을 요구할 수있는 인터페이스를 선언합니다. –

답변

1

전적으로 개체를 사용하는 코드에 따라 다릅니다. 그것이 실제로 "폴리 모프 (polymorphed)"가되는 곳입니다.

  • 목적은 다음 IWorkable 그것을 필요가 IWorkable로 사용될 코드 블록에 사용되는 경우.
  • IFeedable 만 필요한 코드 블록에서 개체를 사용하는 경우 IFeedable으로 사용됩니다.
  • 이 모두 필요한 코드 블록에서이 개체를 사용하는 경우이면 IWorker으로 사용됩니다. (그가 IWorker로 사용할 수 있도록이를 위해, 당신의 Worker 클래스는 아마도 세 가지 인터페이스를 구현해야합니다.)

주요 포인트는 코드의 이러한 블록의 없음 모르거나 신경 쓸 필요가 있는지 여부 그들은 Worker 또는 Robot 또는 Manager에서 작동합니다.

일반화 된 코드 (일반적인 예로 Strategy Pattern 참조)에서 다형성은 객체를 다른 유형으로 해석함으로써 시작됩니다. 해당 객체가 인터페이스, 상속, 객체 추상화 형식을 통해 해당 유형으로 변형 될 수 있으면 해당 객체를 그대로 사용할 수 있습니다. 메모리에있는 동일한 객체는 구현되는 언제든지 해석 될 수 있습니다.

+0

감사합니다. 이 경우 인터페이스의 상속 지점은 무엇입니까? 왜 작업자 클래스는 IWorker가되기 위해 세 인터페이스를 모두 구현해야합니까? – w0051977

+0

@ w0051977 : 그래서 호출 코드는 객체를 두번 변형시켜야 할 필요없이'IWorkable'과'IFeedable' 기능을 모두 사용할 수 있습니다. 하나의 타입 인'IWorker'는 필요한 모든 기능을 포함합니다. 둘 다 필요로하는 호출 코드는'IWorker'를 사용할 수 있습니다. 오직 하나만 필요로하는 호출 코드는 그 특정한 것을 사용할 수 있습니다. 객체를 두 번 polymorph하기 위해 호출 코드를 요구하면 종종 유지가 어렵고 어렵습니다. – David

+0

그건 의미가 있습니다. IWorker 인터페이스를 사용하여 IFeedable 또는 IWorkable을 구현하는 객체의 인스턴스를 만들 수 있습니다 (틀렸다면 수정하십시오). 이 경우 Worker 클래스가 세 인터페이스를 모두 구현해야하는 이유는 무엇입니까? IWorker를 구현할 수 없습니까? – w0051977