정말 논리적 인 설명이 필요합니다. 왜 그들은 그것을 했습니까? 왜 봉인 된 유형을 제약 조건으로 사용하는 것이 좋지 않은가요? 일부 유형에 대해 동일한 기능을 실행해야하며 봉인 된 상태 일 수 있습니다. 무엇이 잘못 되었습니까? 주위에 방법이 있습니까?제네릭 제약 조건으로 sealed 형식을 사용할 수 없습니다.
답변
봉인 된 유형은 (MSDN)에서 파생 될 수 없으므로 일반 유형 제약 조건으로 사용하는 것은 의미가 없습니다. 일반 매개 변수는 그 유형 일 수 있습니다.
클래스의 일반 형식 인수 대신 해당 형식을 사용하는 경우에도 효과는 동일합니다. 따라서 제한.
는 제한된 유형에서 상속하지 않는 유형으로 제한 할 수없는 이유를 살펴하려면이 허용 할 것을 고려 :
public void MyFunction(T arg) where T : Cat or Car
{
}
내가 "존재하지 않는 만들어 또는 "키워드를 사용하여 해당 기능을 사용할 수 있습니다. 이제 arg
변수를 사용하려고합니다. 이게 뭐야? Cat
또는 Car
입니까? 내가 이것을 쓰고 싶은 말 : arg
는 Cat
이지만,이 Car
인 경우에 전화 아무것도 할 경우 잘 작동
public void MyFunction(T arg) where T : Cat or Car
{
arg.Eat();
}
. Car
의 모든 메소드와 동일합니다. 사용 된 유형을 강제로 제한 유형에서 파생 시키면 해당 유형에있는 메소드, 특성 또는 변수가 보장되므로 작성한 코드는 유형 안전성을 갖습니다.
public void MyFunction(T arg) where T : IAnimal
{
arg.Eat(); //Guaranteed to work!
}
다른 방식으로 허용하면 안전하지 않으므로 허용되지 않습니다.
그러나 서로 상속하지 않는 여러 유형을 사용하고 싶습니다 ... – ByoTic
@ user3050072하지만 제약없이 각각의 개별 유형에 어떤 방법/속성이 있는지 어떻게 알 수 있습니까? 이 시점에서 유형 시스템을 사용하면 캐스팅을 허용하지 않으므로 각 유형에 대해 과부하가 발생할 수 있습니다. – BradleyDotNET
@ user3050072 그런 다음 유형이 봉인되지 않아도 그렇게 할 수 없기 때문에 일반 유형 제약 조건을 잘못 이해했습니다. 모든 클래스가 상속하는 인터페이스를 만드는 것을 고려하십시오. – Casey
유형이 봉인 된 경우 제네릭 인수 만 정확히 한 유형일 수 있습니다. 제네릭을 전혀 사용하지 않아도됩니다. 일반 인수를 스크랩하고 일반 인수를 사용했던 곳이면 어디서든 사용할 수 있습니다.
제네릭은 일반용으로 설계되어 하나의 특정 유형을 원할 경우 사용할 수 없습니다.
하지만 포인트가 있습니다! 정확히 동일한 구현으로 특정 유형에만 작동하는 함수가 필요합니다. 똑같은 구현으로 반복해서 오버로드하는 것은 의미가 없습니다! – ByoTic
@ user3050072 : 요점이 있다고 생각되면 질문에 (가짜) 코드를 예로 제시하십시오. 중복이 아닌 고유 한 질문을하는 데 도움이 될 수도 있습니다. –
@ user3050072 일반 형식 인수를 sealed 형식으로 제한하는 것은 그렇게하지 않습니다. 제약 조건은 ORed가 아니라 함께 AND 처리됩니다. 당신은 인터페이스를 사용해야합니다. – Servy
귀하의 질문은 [왜 우리는 일반 제약으로 봉인 된 클래스를 사용할 수 없습니까?] (http://stackoverflow.com/questions/1945085/why-cant-we-use-sealed-classes-as-generic- 제약). int Foo (MyType1 arg) {...} int Foo (MyType2 arg) (...} ....')와 같은 오버로드를 찾고있을 가능성이 있지만, 게시물 (또는 당신이 원하는 것을 분명히 말하는 별도의 질문을하고 이것에 대한 설명으로 당신이 시도한 것을 설명 할 수 있습니다) –