현재 정수 매개 변수를 사용하는 여러 메서드가있는 클래스가 있습니다. 이러한 정수는 응용 프로그램이 수행 할 수있는 연산에 매핑됩니다. 나는 클래스의 소비자가 모든 연산을 가지고있는 enum 타입을 제공 할 수 있도록 클래스를 generic으로 만들고 싶다. 그리고 메소드는 그 enum 타입의 매개 변수를 취할 것이다. 그러나, 나는 그들이 제네릭 타입을 전혀 지정할 수 없도록하고, 현재의 구문에서 변경되지 않은 정수로 디폴트를 되돌려 주길 바란다. 이것이 가능한가?제네릭에 기본 유형을 어떻게 제공합니까?
답변
:
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>();
그래, 난 그 복잡성을 소개하고 싶지 않아. 기본값은 매우 중요하지 않다, 그냥 좋았을거야. 내가하지 않았어. 어떤 방식 으로든 그것을 할 수는 없지만, 먼저 모든 사람들과 확인해보고 싶었습니다.답변 해주셔서 감사합니다 –
컴파일러는 방법 전달 된 인수의 유형에 따라 대부분의 시간의 형태 인수를 추론 할 수있다 :
public void DoSomething<T>(T test) {
}
이
DoSomething(4); // = DoSomething<int>(4);
DoSomething(MyEnum.SomeValue); // = DoSomething<MyEnum>(MyEnum.SomeValue);
그런데
로 호출 할 수 있습니다, 일반 메소드의 비 제네릭 오버로드도 가질 수 있습니다.
"선택적으로 일반"일종의 클래스를 찾고 있습니다. 나는 그것이 가능하지 않기 때문에 비 제네릭 오버로드를 가진 제네릭 메소드를 만들어야 할 것입니다 ...이 "SecurityContext sec = new SecurityContext();"를 찾고있었습니다. (이는 매개 변수에 정수를 사용하여 생성 한 다음 "SecurityContext
원본 버전 (비 일반 버전)을 유지하고 일반 버전을 만드십시오.
그런 다음 제네릭 이외의 버전에서 제네릭 버전을 호출하십시오.
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);
}
일반 매개 변수 유형은 모든 메서드에서 동일하므로 나는 클래스 수준에서 그것을 원할 것이다. 나는 generic 버전을 만들 수 있고 그것을 int 버전으로 상속받을 수 있다는 것을 알고있다. 그러나 나는 그것을 한꺼번에 가져 오기를 바랐다 ... 그러나 나는 어떤 방법을 알지 못했다. –
그래서 ... 단순한 상속을 사용하지 않으시겠습니까? 마찬가지로 :
var X = new MyGenericClass<string>();
var Y = new MyGenericClass(); // Is now MyGenericClass<int>
- 1. Objective-C 프로토콜의 기본 구현을 어떻게 제공합니까?
- 2. 제네릭에 관한 질문
- 3. appDomain은 어떻게 격리를 제공합니까?
- 4. Clojure에서 기본 Java 유형을 어떻게 참조할까요?
- 5. Eclipse에서 기본 Java 유형을 어떻게 설정합니까?
- 6. 어떤 PHP 함수가 파일 유형을 제공합니까?
- 7. Satchmo에서 기본 고객에게 할인을 제공합니까?
- 8. 파이썬은 "무료"기본 이터레이터를 제공합니까?
- 9. Silverlight를 고객에게 어떻게 제공합니까?
- 10. Java의 제네릭에 대한 쿼리
- 11. 개체를 제네릭에 캐스팅하는 방법은 무엇입니까?
- 12. 제네릭에 대한 Java 정적 함수
- 13. 기준을 사용하여 기본 유형을 얻으십시오
- 14. Team City에 파일을 어떻게 제공합니까?
- 15. 개발중인 CSS를 장고에 어떻게 제공합니까?
- 16. svnserve는 어떻게 여러 저장소를 제공합니까?
- 17. Java Web Start는 기본 프로그램 폴더를 제공합니까?
- 18. 제네릭에 대한 유용한 API는 무엇입니까?
- 19. 기본 유형을 파생 유형으로 변환
- 20. SQLServer가 기본 키 유형을 선택합니다.
- 21. 어떻게 .NET에서 기본 클래스의 정적 메소드의 클래스 유형을 얻으려면?
- 22. 어떻게 기본 클래스가 수퍼 유형을 참조하고 컴파일 할 수 있습니까?
- 23. 내 web.config에서 text/html의 기본 콘텐츠 유형을 어떻게 설정합니까?
- 24. 제네릭에 인터페이스를 동적으로 배치하는 방법은 무엇입니까?
- 25. 인덱서 및/또는 제네릭에 대한 질문
- 26. 는 ASP.NET MVC의 기본 유형을 검증
- 27. 템플릿과 같이 런타임에 기본 클래스 유형을 선택하십시오.
- 28. 메모리 내 데이터베이스는 내구성을 어떻게 제공합니까?
- 29. mysql5에서 coldfusion의 세션 값을 트리거에 어떻게 제공합니까?
- 30. 랙을 통해 어떻게 바이너리 파일을 제공합니까?
이 Vilx- 솔루션 좋은 접근 방법과 더 나은 대답 @ 아닌가 :
이 방법은 두 가지 방법을 쓸 수있다? –