繁体   English   中英

C#类型转换基础类/接口与通用方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM