2011-07-18 5 views
4
public T CreateForm<T>() where T: BaseForm, BaseMainForm 

나는 T는 BaseFormBaseMainForm입니다 위의 방법을 알고있다. 그러나 T가 BaseForm또는 a BaseMainForm 중 하나 여야한다는 제약 조건을 만들 수 있습니까?일반 타입과 제약 조건 또는

답변

5

아니요, C#에서는 허용되지 않습니다. 컴파일러는 제네릭 제약을 사용하여 제네릭 메서드 내에서 T에서 사용할 수있는 연산을 결정합니다. 따라서 또는 식을 허용하면 형식이 안전하지 않습니다.

필요한 경우 BaseFormBaseMainForm의 공통 부분을 다루는 인터페이스를 추가하고이를 일반 제약으로 적용하는 것이 좋습니다. 이 방법으로, 인터페이스는 메소드 CreateForm<T>이 필요로하는 계약을 정의합니다. 그리고 폼의 전달에서 인터페이스를 구현하는지 단순히 확인해야합니다. 같은

뭔가 :

public interface IBaseForm 
{ 
    Foo(); 
} 

class BaseForm : IBaseForm {} 
class BaseMainForm : IBaseForm {} 

public T CreateForm<T>() where T : IBaseForm 
+0

명확하고 빠른 대답을 참조하는 새로운 인터페이스로의, BaseForm 및 BaseMainForm의 관심! 고맙습니다! –

+0

BaseForm 또는 BaseMainForm을 제어 할 수 없으므로 인터페이스를 구현할 수 없으므로 훨씬 어려워집니다. –

0

그것은 불가능합니다.

인터페이스 또는 기본 클래스를 추가하고 해당 클래스를 모두 구현 한 다음이를 형식 제약 조건으로 사용하는 것이 좋습니다.

0

아니, 당신은 속성을 추출해야, 그의 CreateForm는 모두 상속 한 다음 방법은 해당 인터페이스를