2010-04-16 1 views
7

나는 다음을 수행하려고 :매개 변수없는 생성자를 사용하도록 파생 클래스를 적용 할 수없는 이유는 무엇입니까?

class Program 
{ 
    static void Main(string[] args) 
    { 
     foo<baz> fooObject = new foo<baz>(); 
     AnotherClass<baz> _baz = new AnotherClass<baz>(); 
     _baz.testMethod(fooObject); 
    } 
} 

public class AnotherClass<T> where T : bar 
{ 
    public void testMethod(foo<T> dummy) 
    { 
     foobar = dummy; 
    } 

    private foo<T> foobar = null; 
} 

public class foo<T> where T : bar, new() 
{ 
    public foo() 
    { 
     _t = new T(); 
    } 

    private T _t; 

} 

public abstract class bar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 

public class baz : bar 
{ 
    public override void someMethod() 
    { 
     //Implementation 
    } 
}  

그리고 'T는'에 매개 변수로 'T'를 사용하기 위해 공공 매개 변수가없는 생성자가 아닌 추상 형식이어야한다는 설명하는 오류 제네릭 형식 또는 메서드 나는 이것이 왜 틀림 없는가를 완전히 이해하고 또한 'new'하는 것을 피하기 위해 'T'타입의 사전 초기화 된 객체를 생성자 인수로 전달할 수 있다는 것을 이해하지만이 문제를 해결하기위한 방법이 있습니까? 매개 변수없는 생성자를 제공하기 위해 'bar'에서 파생되는 클래스를 적용하는 방법은 무엇입니까?

고정 - AnotherClass()에 'new()'제약 조건이 누락되었습니다.

답변

5

은 당신이 당신의 AnotherClass에 대한 새로운() 제약 누락하지?

public class AnotherClass<T> where T : bar, new() 

VS2010을 컴파일하지 않으면, 정상적으로 작동합니다. 내가 일을 위해 "여기서"클래스 "푸" 의 후 키워드에서

+0

고마워, 이걸 고쳤다 고! –

0

새로운 구문이 아닌 일반 구문 new()가 아닌가요?

또한, 당신이 확신하는 클래스의 중간이 아닌 함수에서이 코드를하고있는 것은 배플합니다 :

_t = new T(); 

편집 :

좋아, 그래서 후에 구문 정리, 나는 문제가 'baz'매개 변수가없는 생성자가 없다는 것을 짐작하고있다. 나는 당신이 이것을 집행 할 수있는 어떤 방법을 모르겠습니다.

비슷한 질문이 있습니다. 조금 도움이 될 here입니다.

+0

"클래스 중간에 있음": 초기 값이있는 필드 선언입니다. –

+0

고침, 고마워. 반 의사 코드, 절반 실제 코드의 나쁜 습관! –

7

올바른 구문은 해결 방법처럼

public class foo<T> where T : bar, new() 
+0

죄송합니다. 나는 그것을 서둘러 타이핑했습니다. –

0

입니다 - 당신은 당신이 필요로하는 유형의 인스턴스를 생성 대리자를 전달할 수 있습니다

Func<T> creator = ... 

    _t = creator(); 
1

코드는 VS2010에서 컴파일합니다.

당신은 아마 대신 인터페이스를 사용하려면 :

public class foo<T> where T : ibar, new() 
... 

public interface ibar 
{ 
    void someMethod(); 
} 

public abstract class bar : ibar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 
+0

이것은 나를 위해 같은 문제를 만듭니다 ... –

0

먼저 제거는 "새로운()"

public foo() 
{ 
    _t = Activator.CreateInstance<T>(); 
} 

로 생성자를 변경해야합니다!

관련 문제