2013-08-18 1 views
3

많은 수의 파생 클래스가있는 기본 클래스가 있고 기본 클래스에는 여러 생성자가 있습니다. 모든 파생 된 클래스에서 기본 생성자에 인수를 전달하기 위해 빈 생성자를 구현해야합니다. 어떻게 든 C#에서 파생 생성자를 사용하도록 말할 수 있습니까?파생 클래스에 빈 생성자를 구현하지 않으려면 어떻게해야합니까?

예를 들어,이 기본 클래스를 사용하는 경우. 내가 가진 것

class BaseTool 
{ 
     public BaseTool(string Arg1, string Arg2) 
     { 
      // do stuff. 
     } 

     public BaseTool(string Arg1) 
     { 
      // do stuff. 
     } 

     public BaseTool(int Arg1) 
     { 
      // do stuff. 
     } 
    } 

그 인수로 위의 모든 생성자를 구현하고 파생 클래스로 전달하는 : base(...)를 호출합니다. 이로 인해 빈 생성자가있는 많은 클래스가 생성됩니다. 많은 낭비되는 코드처럼 보입니다.

+2

제가 생각할 수있는 유일한 것은 인스턴스 생성자 대신에'정적'메소드를 만드는 것입니다. 그래서 예를 들어'public static T Create (문자열 Arg1, 문자열 Arg2) 여기서 T : BaseTool, new() {var instance = new T(); 인스턴스에 물건을 넣으십시오. */반환 인스턴스; }'. 이것은'var newDT = BaseTool.Create ("foo", "bar");'로 호출 될 수 있습니다. –

+1

@JeppeStigNielsen : 답변으로 게시하면 upvote :-) – dtb

+0

@dtb 답변으로 게시했습니다. –

답변

4

생성자는 기본 클래스에서 상속되지 않으므로 각 파생 클래스에 모든 생성자를 선언 할 방법이 없습니다. 그러나이 반복 작업은 예를 들어 T4 Templates과 같이 자동화 할 수 있습니다.

2

는 (요청에 의해 댓글에서 승진.)

내가 대신 인스턴스 생성자의 정적 메서드를하고 생각할 수있는 유일한 것. 그래서 예를 들면 :

class BaseTool 
{ 
    public static T Create<T>(string Arg1, string Arg2) where T : BaseTool, new() 
    { 
    var instance = new T(); 
    // do stuff, to instance (which is a BaseTool) 
    return instance; 
    } 

    public static T Create<T>(string Arg1) where T : BaseTool, new() 
    { 
    var instance = new T(); 
    // do stuff, to instance (which is a BaseTool) 
    return instance; 
    } 

    public static T Create<T>(int Arg1) where T : BaseTool, new() 
    { 
    var instance = new T(); 
    // do stuff, to instance (which is a BaseTool) 
    return instance; 
    } 
} 

이 같이 호출 할 수 있습니다 : 일부 BaseTool 내부에서,

var newDT = BaseTool.Create<DerivedTool>("foo", "bar"); 

하거나, (방법부터 는 생성자와 달리, 상속) :

var newDT = Create<DerivedTool>("foo", "bar"); 

나는 그것이 var newDT = new DerivedTool("foo", "bar");보다 조금 덜 우아하다는 것을 안다.

관련 문제