2012-04-25 2 views
1

내 코드는 나중에 각각의 파생 된 유형으로 캐스팅 된베이스 클립이있는 목록을 사용하고 있습니다. 내가해야할 포인트를 쳤다.베이스 클래스에 대한 생성자를 만들면 그 타입이 무엇인지 알아 내서 그 타입으로 바꿀 수 있다고 생각했다. 다음과 같은 것 :생성자가 객체 유형을 변경하도록하십시오.

public class BaseClass 
    { 
     // Constructor 
     BaseClass(string Input) 
     { 
      if (Input.Substring(0, 5) == "Something") 
       return new DerivedClass(); // <-- Not allowed 
     } 
    } 
    public class DerivedClass : BaseClass 
    { 
    } 

생성자가 void를 반환해야하기 때문에 허용되지 않습니다. "this"의 유형 변경도 허용되지 않습니다. 나는이 코드가 작동하는 매우 간단한 대안이 있다는 것을 알고 있지만, 그 코드에는 어떤 우아함이 있다고 생각합니까?

+4

뭔가 다른 것을 만드는 생성자는 우아해야합니까 ?? –

+0

네, C#의 생성자에서 아무것도 반환 할 수 없습니다. 'new'의 결과는 항상 그 타입의 구체적인 인스턴스입니다. 이 작업을 수행하려면 팩토리를 사용해야합니다. 팩토리는 생성 할 파생 형식을 결정하고 반환하는 함수입니다. –

+0

와우, 너는 빠르다! 저의 요점은 이것을 코드화하는 방법을 찾는 것이 아니라 언어 그 자체에 대한 논의로 보는 것입니다. 이 접근법을 직관적으로 생각하는 유일한 사람입니까? – RagnarDa

답변

6

공장 패턴을 살펴 봐야합니다. 이것은 객체의 인스턴스를 만들고 다른 유형의 매개 변수를 기반으로 특정 유형을 결정할 때 사용됩니다.

public static class BaseClassFactory 
{ 
    public static BaseClass Create(string input) 
    { 
     if (input.Substring(0, 5) == "Something") 
      return new DerivedClass(); 

     return new BaseClass(); 
    } 
} 
+0

@JamesJohnson - 필요 없습니다. –

+0

다음은 그를위한 좋은 예입니다. http://www.dotnetperls.com/factory –

+0

또는 위키, http://en.wikipedia.org/wiki/Factory_method_pattern – Patrick

2

나는 또한 Factory Pattern을 권장하지만 다르게 작성합니다. 이렇게하면 new으로 BaseClass가 생성되지 않으므로 클래스를 얻는 유일한 방법은 Create 메서드를 사용하는 것입니다.

public class BaseClass 
{ 
    private BaseClass() 
    { 
    } 

    public static BaseClass Create(string input) 
    { 
    if (input.Substring(0, 5) == "Something") 
     return new DerivedClass(); 

    return new BaseClass(); 
    } 
} 
+0

이 계산되지 않습니다. 정적 클래스의 비 정적 생성자. –

+0

업데이트 됨, 감사합니다! –

+0

나는 OA (original answerer?)가 올린 것이 무엇인지 당신이 지금 생각한 어떤 이유로 생각합니다. 그래서 정적 클래스에 당황 스러웠습니다. 그러나 그는 정적이다. 어쨌든이 패턴에 +1 (기본 클래스의 정적 메서드로 팩토리). 추상 클래스에서도 훌륭하게 작동합니다! –

관련 문제