2009-07-08 3 views
9

현재 정수 매개 변수를 사용하는 여러 메서드가있는 클래스가 있습니다. 이러한 정수는 응용 프로그램이 수행 할 수있는 연산에 매핑됩니다. 나는 클래스의 소비자가 모든 연산을 가지고있는 enum 타입을 제공 할 수 있도록 클래스를 generic으로 만들고 싶다. 그리고 메소드는 그 enum 타입의 매개 변수를 취할 것이다. 그러나, 나는 그들이 제네릭 타입을 전혀 지정할 수 없도록하고, 현재의 구문에서 변경되지 않은 정수로 디폴트를 되돌려 주길 바란다. 이것이 가능한가?제네릭에 기본 유형을 어떻게 제공합니까?

+0

이 Vilx- 솔루션 좋은 접근 방법과 더 나은 대답 @ 아닌가 :

class MyGenericClass<T> { } class MyGenericClass : MyGenericClass<int> { } 

이 방법은 두 가지 방법을 쓸 수있다? –

답변

4
당신은 클래스의 정의에 그것을 할 수 없습니다

:

var foo = new MyGenericClass(); // defaults to integer... this doesn't work 
var bar = new MyGenericClass<MyEnum>(); // T is a MyEnum 

정말 기본 유형의 존재의 INT의 implicitness 가치를하는 경우, 정적 공장을해야 할 것이다 방법, 비록 그것의 가치를 볼 수 없습니다.

public class MyGenericClass<T> 
{ 
    public static MyGenericClass<T> Create() 
    { 
     return new MyGenericClass<T>(); 
    } 
    public static MyGenericClass<int> CreateDefault() 
    { 
     return new MyGenericClass<int>(); 
    } 
} 

위의 내용을 실제로 누리지 않는 방법은 아래를 참조하십시오.

var foo = MyGenericClass<MyEnum>.Create(); 
var bar1 = MyGenericClass.CreateDefault(); // doesn't work 
var bar2 = MyGenericClass<int>.CreateDefault(); // works, but what's the point 

당신이 그것을 심지어 더, 당신은이 문제를 해결하는 정적 팩토리 클래스를 만들 수 있습니다 먹고 싶어하지만 기본을 제공하는 것보다 다른 이유로 그 일을하는 경우 즉 더욱 말도 솔루션의 경우 유형 :

public static class MyGenericClassFactory 
{ 
    public static MyGenericClass<T> Create<T>() 
    { 
     return new MyGenericClass<T>(); 
    } 
    public static MyGenericClass<int> Create() 
    { 
     return new MyGenericClass<int>(); 
    } 
} 

var foo = MyGenericClassFactory.Create(); // now we have an int definition 
var bar = MyGenericClassFactory.Create<MyEnum>(); 
+0

그래, 난 그 복잡성을 소개하고 싶지 않아. 기본값은 매우 중요하지 않다, 그냥 좋았을거야. 내가하지 않았어. 어떤 방식 으로든 그것을 할 수는 없지만, 먼저 모든 사람들과 확인해보고 싶었습니다.답변 해주셔서 감사합니다 –

1

컴파일러는 방법 전달 된 인수의 유형에 따라 대부분의 시간의 형태 인수를 추론 할 수있다 :

public void DoSomething<T>(T test) { 
} 

DoSomething(4);     // = DoSomething<int>(4); 
DoSomething(MyEnum.SomeValue); // = DoSomething<MyEnum>(MyEnum.SomeValue); 
그런데

로 호출 할 수 있습니다, 일반 메소드의 비 제네릭 오버로드도 가질 수 있습니다.

+0

"선택적으로 일반"일종의 클래스를 찾고 있습니다. 나는 그것이 가능하지 않기 때문에 비 제네릭 오버로드를 가진 제네릭 메소드를 만들어야 할 것입니다 ...이 "SecurityContext sec = new SecurityContext();"를 찾고있었습니다. (이는 매개 변수에 정수를 사용하여 생성 한 다음 "SecurityContext sec = new SecurityContext ();"매개 변수에 MyOperations를 사용하여 만듭니다. –

2

원본 버전 (비 일반 버전)을 유지하고 일반 버전을 만드십시오.

그런 다음 제네릭 이외의 버전에서 제네릭 버전을 호출하십시오.

void Main() 
{ 
DoSomething(2); 
DoSomething(EnumValue); 

} 

public void DoSomething(int test) { 
DoSomething<int>(test); 
} 

// Define other methods and classes here 
public void DoSomething<T>(T test) { 
Console.WriteLine(test); 
} 
+0

일반 매개 변수 유형은 모든 메서드에서 동일하므로 나는 클래스 수준에서 그것을 원할 것이다. 나는 generic 버전을 만들 수 있고 그것을 int 버전으로 상속받을 수 있다는 것을 알고있다. 그러나 나는 그것을 한꺼번에 가져 오기를 바랐다 ... 그러나 나는 어떤 방법을 알지 못했다. –

12

그래서 ... 단순한 상속을 사용하지 않으시겠습니까? 마찬가지로 :

var X = new MyGenericClass<string>(); 
var Y = new MyGenericClass(); // Is now MyGenericClass<int> 
관련 문제