2014-09-02 6 views
-3

정말 논리적 인 설명이 필요합니다. 왜 그들은 그것을 했습니까? 왜 봉인 된 유형을 제약 조건으로 사용하는 것이 좋지 않은가요? 일부 유형에 대해 동일한 기능을 실행해야하며 봉인 된 상태 일 수 있습니다. 무엇이 잘못 되었습니까? 주위에 방법이 있습니까?제네릭 제약 조건으로 sealed 형식을 사용할 수 없습니다.

+0

귀하의 질문은 [왜 우리는 일반 제약으로 봉인 된 클래스를 사용할 수 없습니까?] (http://stackoverflow.com/questions/1945085/why-cant-we-use-sealed-classes-as-generic- 제약). int Foo (MyType1 arg) {...} int Foo (MyType2 arg) (...} ....')와 같은 오버로드를 찾고있을 가능성이 있지만, 게시물 (또는 당신이 원하는 것을 분명히 말하는 별도의 질문을하고 이것에 대한 설명으로 당신이 시도한 것을 설명 할 수 있습니다) –

답변

2

봉인 된 유형은 (MSDN)에서 파생 될 수 없으므로 일반 유형 제약 조건으로 사용하는 것은 의미가 없습니다. 일반 매개 변수는 그 유형 일 수 있습니다.

클래스의 일반 형식 인수 대신 해당 형식을 사용하는 경우에도 효과는 동일합니다. 따라서 제한.

는 제한된 유형에서 상속하지 않는 유형으로 제한 할 수없는 이유를 살펴하려면이 허용 할 것을 고려 :

public void MyFunction(T arg) where T : Cat or Car 
{ 
} 

내가 "존재하지 않는 만들어 또는 "키워드를 사용하여 해당 기능을 사용할 수 있습니다. 이제 arg 변수를 사용하려고합니다. 이게 뭐야? Cat 또는 Car입니까? 내가 이것을 쓰고 싶은 말 : argCat이지만,이 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! 
} 

다른 방식으로 허용하면 안전하지 않으므로 허용되지 않습니다.

+0

그러나 서로 상속하지 않는 여러 유형을 사용하고 싶습니다 ... – ByoTic

+1

@ user3050072하지만 제약없이 각각의 개별 유형에 어떤 방법/속성이 있는지 어떻게 알 수 있습니까? 이 시점에서 유형 시스템을 사용하면 캐스팅을 허용하지 않으므로 각 유형에 대해 과부하가 발생할 수 있습니다. – BradleyDotNET

+3

@ user3050072 그런 다음 유형이 봉인되지 않아도 그렇게 할 수 없기 때문에 일반 유형 제약 조건을 잘못 이해했습니다. 모든 클래스가 상속하는 인터페이스를 만드는 것을 고려하십시오. – Casey

0

유형이 봉인 된 경우 제네릭 인수 만 정확히 한 유형일 수 있습니다. 제네릭을 전혀 사용하지 않아도됩니다. 일반 인수를 스크랩하고 일반 인수를 사용했던 곳이면 어디서든 사용할 수 있습니다.

제네릭은 일반용으로 설계되어 하나의 특정 유형을 원할 경우 사용할 수 없습니다.

+0

하지만 포인트가 있습니다! 정확히 동일한 구현으로 특정 유형에만 작동하는 함수가 필요합니다. 똑같은 구현으로 반복해서 오버로드하는 것은 의미가 없습니다! – ByoTic

+0

@ user3050072 : 요점이 있다고 생각되면 질문에 (가짜) 코드를 예로 제시하십시오. 중복이 아닌 고유 한 질문을하는 데 도움이 될 수도 있습니다. –

+2

@ user3050072 일반 형식 인수를 sealed 형식으로 제한하는 것은 그렇게하지 않습니다. 제약 조건은 ORed가 아니라 함께 AND 처리됩니다. 당신은 인터페이스를 사용해야합니다. – Servy