2014-05-21 4 views
1

계층 구조가 있습니다.인터페이스 상속 인터페이스

public interface IIncomingMessage : IMessage 
{ 
    String Source { get; set; } 
    void ProcessMessage(); 
} 


public interface IOutgoingMessages : IMessage 
{ 
    void SendMessage(); 
} 

메시지를 생성하기 위해 정적 CreateMessage 메서드를 사용하는 클라이언트가 있습니다.

IMessage message = MessageFactory.CreateMessage("incomingA"); 
messageA.ProcessMessage(); 

IMessage에 ProcessMessage()를 추가하면 내가 할 수있는 유일한 방법입니다. 그러나이 경우 IOutgoingMessage에서 구현해야합니다.

지금이 글을 쓰면서 IMessage를 제거 할 수 있다는 것을 알았습니다. 아니면 이것을하는 더 좋은 방법이 있습니까?

+2

중 하나를 사용 VAR

var message = MessageFactory.CreateMessage("incomingA"); message.ProcessMessage(); 

('MessageFactory.CreateMessage ("incomingA")을'가정 형 IIncomingMessage의 객체를 반환) 또는 캐스트 이것을 해결하는 방법은 두 가지입니다 :'CreateInboundMessage'와'CreateOutboundMessage' –

+5

인터페이스는 ** 서로 ** 확장됩니다. –

+1

나는 많은 인터페이스를보고 있지만, 내가 보지 못하는 것은 그것들의 의도이다. 무엇을 성취하려고합니까? – zzzzBov

답변

4

CreateMessage 팩토리를 어떻게 사용했는지에 따라 IMessage 유형의 일반적인 방법은 ProcessMessage입니다. 여러분의 코드가 어떻게 작동하는지에 따라, IMessage에는 ProcessMessage 메소드 인터페이스가 정의되어 있어야합니다.

그러나 작은 코드 스 니펫을 살펴보면 사용자의 의도는 항상 메시지를 처리하는 것이 아니라 IIncomingMessage 구현 인 경우에만 수행하는 것으로 보입니다. 그래서 당신의 공장 접근 방식은 효과가 없을 것입니다. T. Kiley가 두 가지 팩토리 메소드 (예 : CreateInboundMessageCreateOutboundMessage)를 사용하는 것이 두 가지 유형의 메시지에 서로 다른 동작을하기 때문에 더 유용 할 수 있습니다. 그런 다음 해당 메서드는 IIncomingMessage 및 'IOutgoingMessage` 인스턴스를 반환 한 다음이를 처리하거나 적절하게 처리 할 수 ​​있습니다.

IMessage이 현재 마커 인터페이스로 사용되고 있습니다. 제네릭의 제한 사항 (예 : MyCollection<T> where T : IMessage)이든이 필요성을 알게되면 보관하십시오. 그러나 실제로 행동이나 속성/메소드의 공통 집합을 설명하지 않거나 유용한 마커로 사용하지 않는다면 어떤 이점이 있는지 확실하지 않습니다.

다시 말하지만이 코드는 약간의 코드를 기반으로합니다. 배후에 더 많은 동작과 기능이 있다고 가정합니다. 행운을 빕니다!!

1

나는이 시나리오의 또 다른 예를 제공함으로써 단순화하려고합니다 : 지금 AnimalEatBanana()를 추가하는 경우

public class Animal 
{ 
    void Run(); 
} 

public class Giraffe : Animal 
{ 
    void ExtendNeck(); 
} 

public class Monkey : Animal 
{ 
    void EatBanana(); 
} 

지금은 괜찮아? 모든 IMessage 구현자가 ProcessMessage()이 아니며이 예제에서는 모든 동물이 EatBanana()이 아닌 것으로 나타났습니다. 당신이하려는 것을 이루기위한 또 다른 방법은 무엇입니까? 수업간에 공통적 인 기능을 공유하는 경우에만 IMessage을 사용하십시오. 네가 가진 것이 없다면, 정면이 필요 없다. YAGNI를 염두에 두십시오. 공통 기능이있는 경우 나중에 추가 할 수 있습니다. IncomingMessage을 만들고 IncomingMessage 특정 메서드를 호출하려면 강력한 형식의 IncomingMessage을 만들고이를 사용하십시오. 정적 팩토리 메서드가 필요하지 않을 수도 있습니다.

0

아무 것도 상속하지 않고 프로세스를 완전히 분리하는 여러 클래스를 사용할 수 있습니다. 그렇게하면 서브 클래 싱을 사용하는 몇 가지 이점이 사라집니다. 두 클래스가 공통 클래스를 확장하는 경우 다른 클래스를 쉽게 참조 할 수 있도록 비슷한 속성이있을 수 있습니다. 이러한 하위 클래스의 메서드 문제는 부모 클래스에서 공통 메서드 (ProcessMessage()이라고 함)를 선언하고 각 하위 클래스에서 해당 메서드의 동작을 덮어 쓰게 할 수 있습니다. 이 방법을 사용하면 서로 다른 방법이 아니라 두 가지 다른 정의가 필요합니다. 간단한 다형성 개념.

0

아마도 간단한 결과

IMessage message = MessageFactory.CreateMessage("incomingA"); 

    if (!(message is IIncommingMessage)) 
     throw new InvalidOperationException(); 

    (message as IIncommingMessage).ProcessMessage(); 
+0

이 접근 방식이 효과가 있지만. 나는보기 흉하게 생각합니다. 더 나은 디자인으로, OP는 장소의 모든 유형의 수표를 넣을 필요가 없습니다. –

+0

나는 동의한다. 그러나 나는 그 질문에 답하려고했다. 디자인을 비판하지 않았다. – tooslow