接口作为参数还是泛型类型约束?标准做法是什么?

问题描述 投票:0回答:1

在课堂上我们有一个简单的任务来学习抽象类、接口和继承。 我第一次看到您可以将接口作为类型而不是实现该接口的类传递。

根据标题,哪个是更标准的做法? 在这个例子中,两者都有效,而且我很确定两者总是有效,只是泛型具有更大的灵活性?

public interface IPerson {}
public abstract class Person : IPerson
{
    protected Person() {}
}
public class Employee : Person
{   
    public Employee() : base() {}
}

public class PersonManager<T> where T : IPerson
{
    private List<T> people = new List<T>();
}
//OR
public class PersonManager
{
    private List<IPerson> people = new List<IPerson>();
}

c# oop generics interface
1个回答
0
投票

在大多数情况下,您应该使用非通用版本。尝试使所有内容通用将使您的代码和类变得不必要的复杂。

使用通用版本有几个原因:

  1. 您想确保所有人员都属于同一类型。另请参阅有些相关的“奇怪的重复模板模式”
  2. 您的
    people
    字段是公开的。这实际上会使您的类成为一个专门的泛型集合,因此使用泛型集合的所有原因都可能适用。
  3. 性能。通用类将使抖动为每种不同类型生成代码。这可以实现一些原本不可能实现的优化。但与往常一样,在做任何事情之前都要进行优化、分析和测量。不要在不了解规则适用环境的情况下盲目遵循规则。

可能还有更多泛型有用的情况,这只是我想到的主要情况。

但是您应该尽量保持代码尽可能简单和可读。因此,除非您有其他原因,否则请使用常规的普通多态性。

© www.soinside.com 2019 - 2024. All rights reserved.