제네릭 메서드 다중 (OR) 형식 제약 조건
이것을 읽으 면서 메소드가 일반적인 메소드로 만들어 여러 유형의 매개 변수를 허용 할 수 있다는 것을 알게되었습니다. 이 예에서 다음 코드는 유형 제약 조건과 함께 사용되어 "U"가입니다 IEnumerable<T>
.
public T DoSomething<U, T>(U arg) where U : IEnumerable<T>
{
return arg.First();
}
다음과 같은 여러 유형 제약 조건을 추가 할 수있는 코드가 더 있습니다.
public void test<T>(string a, T arg) where T: ParentClass, ChildClass
{
//do something
}
그러나이 코드 arg
는 ParentClass
및 유형이어야합니다 ChildClass
. 내가하고 싶은 것은 arg가 유형 ParentClass
이거나 ChildClass
다음과 같은 방식 일 수 있다는 것입니다.
public void test<T>(string a, T arg) where T: string OR Exception
{
//do something
}
당신의 도움은 항상 감사합니다!
불가능합니다. 그러나 특정 유형에 대한 과부하를 정의 할 수 있습니다.
public void test(string a, string arg);
public void test(string a, Exception arg);
그것들이 제네릭 클래스의 일부라면, 제네릭 버전의 메소드보다 선호됩니다.
Botz의 대답은 100 % 정확합니다. 간단한 설명은 다음과 같습니다.
메소드를 작성하거나 (일반적이든 아니든) 메소드가 취하는 매개 변수 유형을 선언하면 계약을 정의하는 것입니다.
Type T가 수행하는 방법을 알고있는 일련의 작업을 수행하는 방법을 알고있는 객체를 제공하면 'a': 선언 한 유형의 반환 값 또는 'b': 사용하는 일종의 동작을 제공 할 수 있습니다. 그 유형.
한 번에 두 개 이상의 유형을 제공하려고하거나 (또는 or를 가짐) 계약이 퍼지되는 유형이 둘 이상일 수있는 값을 반환하려고하는 경우 :
줄넘기를하는 방법을 알고 있거나 파이를 15 자리로 계산하는 방법을 알고있는 물체를 주면 낚시를하거나 콘크리트를 섞을 수있는 물체를 돌려줍니다.
문제는 당신이 방법에 들어갈 때 그들이 당신에게 또는를 주 었는지 전혀 모른다 IJumpRope
는 것 PiFactory
입니다. 또한, 당신이 계속해서 (매직 컴파일하기 위해 가정했다면) 메소드를 사용할 때 실제로 a Fisher
또는 a가 있는지 확실하지 않습니다 AbstractConcreteMixer
. 기본적으로 그것은 모든 것을 더 혼란스럽게 만듭니다.
문제에 대한 해결책은 다음 두 가지 가능성 중 하나입니다.
각각의 가능한 변환, 동작 등을 정의하는 둘 이상의 방법을 정의하십시오. 보츠의 대답입니다. 프로그래밍 세계에서는이를 메서드 오버로딩이라고합니다.
메소드에 필요한 모든 작업을 수행하는 방법을 알고 기본 클래스 또는 인터페이스를 정의하고 하나의 메소드 만 해당 유형을 갖도록하십시오 . 구현에 매핑하는 방법을 정의 하기 위해 a
string
와Exception
작은 클래스를 래핑하는 것이 포함될 수 있지만 모든 것이 매우 명확하고 읽기 쉽습니다. 나는 4 년 후에 와서 코드를 읽고 무슨 일이 일어나고 있는지 쉽게 이해할 수있었습니다.
선택하는 것은 선택 1과 2가 얼마나 복잡한 지와 얼마나 확장 가능한지에 달려 있습니다.
따라서 특정 상황에 대해 예외에서 메시지 또는 무언가를 꺼내고 있다고 상상할 것입니다.
public interface IHasMessage
{
string GetMessage();
}
public void test(string a, IHasMessage arg)
{
//Use message
}
이제 a string
와 a Exception
를 IHasMessage로 변환하는 메소드 만 있으면됩니다. 아주 쉽게.
ChildClass가 ParentClass에서 파생 된 것을 의미하는 경우 ParentClass와 ChildClass를 모두 허용하도록 다음을 작성할 수 있습니다.
public void test<T>(string a, T arg) where T: ParentClass
{
//do something
}
반면에 상속 관계가없는 두 가지 유형을 사용하려면 동일한 인터페이스를 구현하는 유형을 고려해야합니다.
public interface ICommonInterface
{
string SomeCommonProperty { get; set; }
}
public class AA : ICommonInterface
{
public string SomeCommonProperty
{
get;set;
}
}
public class BB : ICommonInterface
{
public string SomeCommonProperty
{
get;
set;
}
}
그런 다음 일반 함수를 다음과 같이 작성할 수 있습니다.
public void Test<T>(string a, T arg) where T : ICommonInterface
{
//do something
}
참고 URL : https://stackoverflow.com/questions/10833918/generic-method-multiple-or-type-constraint
'Programming' 카테고리의 다른 글
JavaScript에서 REST 웹 서비스 API를 호출하는 방법은 무엇입니까? (0) | 2020.07.18 |
---|---|
Objective-C에서 객체를 캐스팅하는 방법 (0) | 2020.07.18 |
C ++ 성능 문제 : 정수에서 std :: string으로의 변환 (0) | 2020.07.17 |
인터페이스, 구현 또는 둘 다를 언급하십니까? (0) | 2020.07.17 |
wix 'KeyPath'속성은 무엇입니까? (0) | 2020.07.17 |