일반 인터페이스에 객체를 캐스팅합니다
문제
다음 인터페이스가 있습니다.
internal interface IRelativeTo<T> where T : IObject
{
T getRelativeTo();
void setRelativeTo(T relativeTo);
}
그리고 다음과 같이 구현 해야하는 여러 클래스.
public class AdminRateShift : IObject, IRelativeTo<AdminRateShift>
{
AdminRateShift getRelativeTo();
void setRelativeTo(AdminRateShift shift);
}
나는이 세 가지가 동일하지 않다는 것을 알고있다.
IRelativeTo<>
IRelativeTo<AdminRateShift>
IRelativeTo<IObject>
그럼에도 불구하고, 나는 adminrateshift (및 fxrateshift, detrateshift)와 같은 모든 다른 클래스와 함께 일을 구현 해야하는 방법이 필요합니다. adminratesHift를 개체로 반환하는 기능이 있다고 가정 해 봅시다.
IRelativeTo<IObject> = getObjectThatImplementsRelativeTo(); // returns Object
인터페이스에 대한 프로그래밍을 통해 필요한 것을 할 수 있지만 실제로 객체를 irelativeto에 캐스팅하여 사용할 수는 없습니다.
그것은 사소한 예이지만, 내가하려는 일을 명확히하기를 바랍니다.
해결책
질문을 이해한다면 가장 일반적인 접근 방식은 비 게 릭 기본 인터페이스를 선언하는 것입니다.
internal interface IRelativeTo
{
object getRelativeTo(); // or maybe something else non-generic
void setRelativeTo(object relativeTo);
}
internal interface IRelativeTo<T> : IRelativeTo
where T : IObject
{
new T getRelativeTo();
new void setRelativeTo(T relativeTo);
}
또 다른 옵션은 주로 제네릭으로 코딩하는 것입니다 ... 즉, 당신은 다음과 같은 방법이 있습니다.
void DoSomething<T>() where T : IObject
{
IRelativeTo<IObject> foo = // etc
}
만약 IRelativeTo<T>
논쟁입니다 DoSomething()
, 그 다음에 대개 일반 유형 인수를 직접 지정할 필요가 없습니다. 컴파일러가 추론합니다 - 즉
DoSomething(foo);
보다는
DoSomething<SomeType>(foo);
두 가지 접근 방식에는 이점이 있습니다.
다른 팁
불행히도 상속은 제네릭에서 작동하지 않습니다. 기능이 irelativeto를 기대하면 기능을 일반화 할 수 있습니다.
void MyFunction<T>(IRelativeTo<T> sth) where T : IObject
{}
내가 올바르게 기억한다면 위의 기능을 사용하면 유형을 지정할 필요조차 없으며 컴파일러는 공급 인수에 따라 파악해야합니다.
클래스 나 메소드 내부에서 이러한 irelativeto 객체 중 하나에 대한 참조를 유지하려면 (그리고 그게 무엇인지 신경 쓰지 않으면이 클래스/메소드를 다시 일반화해야합니다.
나는 약간의 고통이라는 데 동의합니다.
당신이 관심을 갖는 것이 Illativeto가 iobjects를 다루는 것입니다.
interface IRelativeTo
{
IObject getRelativeTo();
void setRelativeTo(IObject relativeTo)
}
그러나 구현 클래스는 여전히 일반적 일 수 있습니다.
abstract class RelativeTo<T> : IRelativeTo where T : IObject
{
public virtual T getRelativeTo() {return default(T);}
public virtual void setRelativeTo(T relativeTo) {}
IObject IRelativeTo.getRelativeTo() {return this.getRelativeTo(); }
void IRelativeTo.setRelativeTo(IObject relativeTo)
{ this.setRelativeTo((T) relativeTo);
}
}
class AdminRateShift : RelativeTo<AdminRateShift>, IObject {}
그런 다음 다음을 수행 할 수 있습니다.
IRelativeTo irt = new AdminRateShift();
IObject o = irt.getRelativeTo();
irt.setRelativeTo(o);