Csharp/C#教程:将对象转换为通用接口分享


将对象转换为通用接口

我有以下界面:

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,所以我可以使用它。

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

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

 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); } 

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

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

如果IRelativeToDoSomething()的参数,那么通常你不需要自己指定generics类型参数 – 编译器会推断它 – 即

 DoSomething(foo); 

而不是

 DoSomething(foo); 

这两种方法都有好处。

遗憾的是,inheritance不适用于generics。 如果你的函数需要IRelativeTo,你也可以使函数通用:

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

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

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

我同意,这有点痛苦。

如果您关心的是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 {} 

然后你可以这样做:

上述就是C#学习教程:将对象转换为通用接口分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

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

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/953043.html

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐