기본적으로 구현하고자하는 것은 제네릭 인터페이스를 구현할 때 구현되는 경우 추가 기능을 제외하고는 T와 똑같이 동작 할 수있는 클래스를 생성하는 것입니다. 여기에 내가 이야기하고있는 예는 다음과 같습니다이 잘하고 좋은C# 인터페이스 : 인터페이스 자체 내에서 인터페이스를 구현하는 유형을 참조 할 수 있습니까?
public interface ICoolInterface<T>
{
T Value { get; set; }
T DoSomethingCool();
}
public class CoolInt : ICoolInterface<int>
{
private int _value;
public CoolInt(int value)
{
_value = value;
}
public int Value
{
get { return _value; }
set { _value = value; }
}
public int DoSomethingCool()
{
return _value * _value;
// Ok, so that wasn't THAT cool
}
}
그리고,하지만 CoolInt를 사용하기 위해, 나는 이런 식으로 뭔가를 할 필요가 :
CoolInt myCoolInt = new CoolInt(5);
int myInt = myCoolInt.Value;
I을 적어도 CoolInt는 int와 똑같이 작동한다는 점에서 많은 것을 배제 할 수 없습니다. 즉 :
CoolInt myCoolInt = 5;
int myInt = myCoolInt;
는이를 달성하기 위해, 내 CoolInt 클래스에이 두 가지 변환 연산자를 추가 :
public static implicit operator CoolInt(int val)
{
return new CoolInt(val);
}
public static implicit operator int(CoolInt obj)
{
return obj.Value;
}
는 놀랍도록 작동합니다. 이제 인터페이스에 구현 자들이 이 연산자를 구현하도록이 두 가지 오버로드를 인터페이스에 추가 할 수 있다면이 인터페이스를 선호합니다. 문제는이 연산자의 프로토 타입이 CoolInt를 직접 참조한다는 것입니다.
C#에는 암시 적으로 정의되거나 아직 정의되지 않은 것들에 대한 "자리 표시 자"이름이 많이 있습니다. 일반적인 프로그래밍에서 일반적으로 사용되는 T는 하나의 예입니다. 속성에 사용 된 value 키워드가 다른 키워드라고 가정합니다. "이"참조는 다른 것으로 간주 될 수 있습니다. 인터페이스에 "이 인터페이스를 구현하는 클래스의 유형"을 나타 내기 위해 사용할 수있는 또 다른 심볼이 필요합니다. "구현 자".
public static implicit operator implementer(int val)
{
return new IntVal(val);
}
public static implicit operator int(implementer obj)
{
return obj.Value;
}
이것은 가능합니까?
그렇습니다. 연산자 오버로딩이 작동하지 않는 것은 이상합니다. 여기에 게시 된 추상 일반적인 예에서는 한 가지 방법으로 작동하지만 다른 방식으로는 작동하지 않는 것처럼 보입니다! –