문제

다음 인터페이스가 있습니다.

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top