2013-04-30 1 views
1

:적절한 메서드를 호출하기 위해 C# 개체 팩토리에 대한 형식 검사가 필요합니까? 다음 의사 C# 코드 감안할 때

class BigMessage : Message { } 

class SmallMessage : Message { } 

abstract class Message 
{ 
    static public Message Factory() 
    { 
     Random random = new Random(); 
     int randomNumber = random.Next(0, 100); 
     if (randomNumber > 50) 
     { 
      return new BigMessage(); 
     } 
     else 
     { 
      return new SmallMessage(); 
     } 
    } 
} 

class Worker 
{ 
    public void Comprehend(BigMessage bm) 
    { 
    } 
    public void Comprehend(SmallMessage bm) 
    { 
    } 
    public void start() { 
     Message msg = Message.Factory(); 
     Comprehend(msg); 
    } 
} 

나는 나에게 메시지 (예를 들어 큰 또는 작은 메시지)로부터 상속 된 임의의 메시지 객체를 제공하기 위해 공장을 요청하고, 나는 노동자 계급의 이해 방법을 원하는 경우 과부하 (명시 적 유형 검사가 아닌 올바른 OO 방법)를 사용하여 주어진 메시지 유형에 따라 작동하려면 다음 두 가지 유형의 오류가 발생하고 왜 내가 잘못했는지 이해할 수 있도록 도와 줄 수 있습니까?

  1. 'Worker.Comprehend (BigMessage)'에 대한 최상의 오버로드 된 메서드 일치에는 잘못된 인수가 있습니다.
  2. 은 '메시지'에서로 변환 할 수 없습니다 'BigMessage'

가 궁극적으로 나는 공장은 내가 미리 알 수없는 유형의 메시지에서 상속 객체로 날을 제공 할 전망이다. 내가 반환 한 다른 유형을 다르게 행동해야합니다. 상속은이 시나리오에서 매우 유용합니다. 추상 클래스는 하위 클래스와 공유되는 많은 유용한 기능을 제공하기 때문입니다.

.NET 4.5가 사용됩니다.

미리 감사드립니다.

답변

3

변환 오류가 발생하는 이유는 "메시지"유형을 구체적 "BigMessage"또는 "SmallMessage"로 변환 할 수 없기 때문입니다. 그것은 Comprehend (Message msg)를 가지고 있고 상속 된 객체를 받아들이도록 허용하는 다른 방법입니다.

또한 여러분이 달성하려고 시도하는 것은 다형성입니다. 나는 당신의 객체를 올바르게 생성 할 수 있다고 믿는다. 기본 추상 클래스 Message는 "Comprehend"라는 메소드를 가져야하며, 작업자 프로세스에서는 msg.Comprenhend()를 호출한다. 이렇게하면 더 많은 메시지 유형을 얻으므로 각 메시지의 작업자 클래스에 추가 이해 메소드를 추가하지 않습니다. OOP와 상속을 활용함으로써 객체가 자신을 이해하는 방법을 결정하도록 할 수 있습니다. 아래

샘플 코드 :

abstract class Message 
{ 
    abstract void Comprehend(); 
    public static Message Factory(){... code here to return message } 
} 

class BigMessage : Message 
{ 
    public void Comprehend() 
    { 
    //do work here 
    } 
} 

class SmallMessage : Message 
{ 
    public void Comprehend() 
    { 
    //do work here 
    } 

class Worker 
{ 
    public void Start() 
    { 
    var msg = Message.Factory(); 
    msg.Comprehend(); 
    } 

}이 도움이

희망!

+0

물론! 감사. –