[英]C# Type casting base class / interface vs. generic method
说我有一个带有共享接口的简单继承结构:
public interface IMammal
{
...
}
public class Human : IMammal
{
...
}
public class Animal : IMammal
{
...
}
并在另一个类(Main.cs或其他类)中说,我想实现一个方法。 以下哪项是“最佳实践”:
public void MyFunction(IMammal input)
{
// Do cool things with the IMammal.
}
要么
public void MyFunction<T>(T input) where T : IMammal
{
// Do the same cool things with the IMammal.
}
注意:在这种简单情况下,可能的解决方案是使IMammal成为抽象类,并在该抽象类中实现MyFunction。 我需要保持IMammal一个接口。
最佳实践通常是第一种情况,并让基础运行时的多态行为为您处理类型。 除非您特别需要知道类型(并且作为泛型!),否则最好不要传递它。
当您要调用其他需要通用的方法(例如那些操纵集合或序列化并且必须处理T
而不是对象的实际类型)的方法时,就会出现第二种选择。 但是,这是非常罕见且非常具体的行为,因此最好仅在绝对必要的情况下使用它。
这取决于MyFunction
功能 。 如果MyFunction
在没有泛型的情况下按设计方式工作,则应采用这种方式-使用多态通常比引入泛型更干净。 如果到达使用泛型有益的地步(例如,像添加到List<T>
而不是List<Mammal>
切换到泛型。
创建工作代码,然后专注于我们改进 。
我认为最好是第一个,而不是如果您要调用其他类,则应该通过接口而不是类。
public void MyFunction(Mammal input)
{
// Do cool things with the mammal.
}
另外,最好校准IMammal而不是Mammal接口。
这是因为MyFunction是另一个类的方法,根据最佳实践,最好注入一个Interface而不是一个对象。
对于您的特殊情况,我通常会选择第一种选择。
但是,对于更复杂的情况,第二个选项更好,因为它允许您进一步指定类型约束,例如从多个接口,类和接口等继承。例如,它还可以实例化新的T对象,如果您还在方法的where
子句中包含new()
。
我看到两个实现是等效的。 那么简单就是最好的选择,所以我更喜欢选择#1。
如果MyFunction是哺乳动物的行为,则应在界面中。 如果您进行了一些验证,例如,并且需要更高层次的ex进行其他验证,则将其放在其他类中应该很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.