当前位置:  开发笔记 > 编程语言 > 正文

将对象转换为通用接口

如何解决《将对象转换为通用接口》经验,为你挑选了3个好方法。

我有以下界面:

internal interface IRelativeTo where T : IObject
{
    T getRelativeTo();
    void setRelativeTo(T relativeTo);
}

和一堆(应该)实现它的类,例如:

public class AdminRateShift : IObject, IRelativeTo
{
    AdminRateShift getRelativeTo();
    void setRelativeTo(AdminRateShift shift);
}

我意识到这三个不一样:

IRelativeTo<>
IRelativeTo
IRelativeTo

但是,我需要一种方法来处理所有不同的类,如AdminRateShift(和FXRateShift,DetRateShift),它们都应该实现IRelativeTo.假设我有一个函数将AdminRateShift作为Object返回:

IRelativeTo = getObjectThatImplementsRelativeTo(); // returns Object

通过对接口进行编程,我可以做我需要的,但我实际上无法将对象转换为IRelativeTo,所以我可以使用它.

这是一个微不足道的例子,但我希望它能澄清我想要做的事情.



1> Marc Gravell..:

如果我理解这个问题,那么最常见的方法是声明一个非通用的基接口,即

internal interface IRelativeTo
{
    object getRelativeTo(); // or maybe something else non-generic
    void setRelativeTo(object relativeTo);
}
internal interface IRelativeTo : IRelativeTo
    where T : IObject
{
    new T getRelativeTo();
    new void setRelativeTo(T relativeTo);
}

另一种选择是你在泛型中很大程度上编码...即你有类似的方法

void DoSomething() where T : IObject
{
    IRelativeTo foo = // etc
}

如果IRelativeTo是一个参数DoSomething(),那么通常你不需要自己指定泛型类型参数 - 编译器会推断它 - 即

DoSomething(foo);

而不是

DoSomething(foo);

这两种方法都有好处.


嗨,我已经完成了你描述的第一种方法.有没有办法让一个继承`IRelativeTo 的类也不必实现`IRelativeTo`?

2> Grzenio..:

遗憾的是,继承不适用于泛型.如果你的函数需要IRelativeTo,你也可以使函数通用:

void MyFunction(IRelativeTo sth) where T : IObject
{}

如果我没记错的话,当你使用上面的函数时甚至不需要指定类型,编译器应该根据你提供的参数找出它.

如果要在类或方法中保留对这些IRelativeTo对象之一的引用(并且您不关心T是什么),则需要再次使此类/方法通用.

我同意,这有点痛苦.



3> Mark Cidade..:

如果您关心的是IRelativeTo处理IObjects,那么您不需要将其设为通用:

interface IRelativeTo
 {
   IObject getRelativeTo();
   void setRelativeTo(IObject relativeTo)
 }

但是,实现类可能仍然是通用的:

abstract class RelativeTo  : 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, IObject {}

然后你可以这样做:

  IRelativeTo irt = new AdminRateShift();
  IObject o = irt.getRelativeTo();
  irt.setRelativeTo(o);

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有