C # 4.0에서 클래스에 대한 일반 분산이없는 이유는 무엇입니까?
인터페이스 용이 있다면 클래스 용으로도 사용하지 않는 이유는 무엇입니까? 그것을 사용할 때 우리가 겪게 될 문제는 무엇입니까?
C<T>
T에서 공변 인 클래스 가 있다고 가정합니다. 그 구현은 어떻게 생겼을까 요? T는 밖에 나가야합니다. 즉 , 필드는 속성 setter와 논리적으로 동일하기 때문에 T , C<T>
setter가있는 T 유형의 속성 또는 T 유형의 필드를받는 메서드를 가질 수 없습니다 . T가 들어갑니다.
공변 클래스로 빌드 할 수있는 유일한 유용한 것은 T에 관한 한 변경 불가능한 것입니다. 자, 나는 공변 불변 목록과 스택을 갖는 것이 멋질 것이라고 생각합니다. 그러나 그 기능은 형 시스템이 기본적으로 공변 불변 클래스 유형을 지원하도록 만드는 데 막대한 지출을 정당화 할만큼 명백히 대단하지 않습니다.
위의 의견은 이것이 유용한 곳의 예를 요청했습니다. 다음 스케치를 고려하십시오.
sealed class Stack<out T>
{
private readonly T head;
private readonly Stack<T> tail;
public T Peek() { return head; }
public Stack<T> Pop() { return tail; }
public Stack(T head, Stack<T> tail)
{
this.tail = tail;
this.head = head;
}
}
static class StackExtensions
{
public static Stack<T> Push<T>(this Stack<T> tail, T head)
{
return new Stack<T>(head, tail);
}
public static bool IsEmpty<T>(this Stack<T> stack)
{
return stack == null;
}
}
공변 클래스가 있다고 가정하십시오. 이제 말할 수 있습니다
Stack<string> strings = null;
strings = strings.Push("hello");
strings = strings.Push("goodbye");
Stack<object> objects = strings;
objects = objects.Push(123);
그리고 우리는 정수를 문자열 스택에 넣었지만 모든 것이 잘되었습니다! 이것이 형식 안전이 될 수없는 이유가 없습니다. 변경 가능한 데이터 구조에서 유형 안전성을 위반하는 작업은 변경 불가능한 데이터 구조에서 안전하게 공변 할 수 있습니다.
C # 및 VB.NET 팀과 함께 .NET 팀은 제한된 리소스를 가지고 있으며 공 변성 및 반공 변성에 대해 수행 한 작업은 대부분의 실제 문제를 해결 합니다. 유형 시스템은 제대로 작동하기가 매우 복잡합니다. 99.9999 %의 경우에서 작동하는 솔루션은 다른 경우에서 안전하지 않은 코드로 이어질 경우 충분하지 않습니다.
클래스 메서드에 대한 공분산 및 반공 변성 사양 (예 : "in"/ "out")을 지원하는 데 드는 비용 / 시간이 충분히 가치가 있다고 생각하지 않습니다. 다중 클래스 상속이 없기 때문에 사용할 수있는 경우를 거의 볼 수 없습니다.
이 지원을 받기 위해 .net을 위해 6 개월을 더 기다렸습니까?
이것을 생각하는 또 다른 방법은 .net에서
- 인터페이스 / 대리자 – 애플리케이션 의 개념적 유형 시스템 을 모델링하는 데 사용됩니다.
- 클래스 는 위의 유형 을 구현 하는 데 사용됩니다.
- 클래스 상속 은 위의 작업을 수행하는 동안 코드 중복을 줄이는 데 사용됩니다.
- 공 변성 및 반반 변성 은 응용 프로그램 의 개념적 유형 시스템 에 관한 것입니다.
이 msdn 게시물 확인 : 제네릭 형식의 변형 (C # 프로그래밍 가이드)
'IT TIP' 카테고리의 다른 글
Java에서 지정된 날짜 동안 일광 절약 시간 (DST)이 활성 상태인지 확인 (0) | 2021.01.06 |
---|---|
일괄 적으로 "종료하려면 Enter를 누르십시오"를 수행하는 방법 (0) | 2021.01.06 |
Android에서 TextView의 색상을 설정하는 방법은 무엇입니까? (0) | 2021.01.06 |
PowerShell의 스위치 매개 변수와 같은 열거 형 (0) | 2021.01.06 |
가장 높은 UIViewController 얻기 (0) | 2021.01.06 |