使用 Interface 或 Class 定义变量

Defining a variable with Interface or with Class

我最近突然想到:

我们有一个接口:

interface IPerson { }

和实现所述接口的Class:

class Person : IPerson{ }

现在,初始化 Person-Variable 的首选方法是什么:

Person person = new Person();

或:

IPerson person = new Person();

使用类型推断和智能感知

var person = new Person();

表明该人属于 Person 类型,而不是 IPerson。 我也在想这样的事情:

List<IPerson> persons;

对比这个:

List<Person persons;

在这种情况下,声明变量或定义集合的首选方式是什么,以及在未来的重构等方面。 如果这是一个重复的问题,请告诉。

此致

通常,您更喜欢使用接口。假设你有一个 Person 的列表,你也有一个人,比如 SuperHero:

class SuperHero : IPerson{ }

在这种情况下,SuperHero 可能继承自 Person,但作为示例,我们可能会认为这没有意义。所以你有 2 类 实施 IPerson.

如果您有 Person 类型的变量,则无法管理 SuperHero。如果你有 List<Person>,你只能存储 Person,而不是 SuperHero

如果您需要使用任何 IPerson,您必须使用接口:

List<IPerson> list = new List<IPerson>();
list.Add(new Person());
list.Add(new SuperHero());

关于“var”的一点。如果您使用 var,编译器会将 var 更改为您在右侧使用的类型。你可以强制转换:

var person = (IPerson)new Person();

当您使用 OLE 自动化和 COM 对象时,在 .NET 中您需要接口的实现。该实现具有 Class 后缀。但是您可以使用没有 Class 后缀的接口。此处有更多信息:https://docs.microsoft.com/es-es/archive/blogs/mshneer/vs-2010-compiler-error-interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead