为什么在实例化接口时出现错误?

本文关键字:错误 实例化 接口 为什么 | 更新日期: 2023-09-27 18:01:22

我有一个类和一个接口,当我尝试实例化接口时,我得到一个错误:

不能创建抽象类或接口的实例

我的代码如下:

namespace MyNamespace
{
    public interface IUser
    {
        int Property1 { get; set; }
        string Property2 { get; set; }
        string Property3 { get; set; }
        void GetUser();
    }
    public class User : IUser
    {
        public int Property1 { get; set; }
        public string Property2 { get; set; }
        public string Property3 { get; set; }
        public void GetUser()
        {
           //some logic here...... 
        }
    }
}

当我尝试实例化IUser user = new IUser();时,我得到一个错误:

不能创建抽象类或接口的实例

我在这里做错了什么?

为什么在实例化接口时出现错误?

错误信息似乎不言自明。您不能实例化接口的实例,并且您已经将IUser声明为接口。(同样的规则也适用于抽象类。)接口的全部意义在于它不任何事情;它的方法没有提供实现。

然而,您可以实例化一个类的实例,该实例实现接口(为其方法提供实现),在您的示例中是User类。

因此,你的代码应该像这样:
IUser user = new User();

这将实例化User类的实例(它提供了实现),并将其分配给接口类型的对象变量(IUser,它提供了接口,您作为程序员可以与对象交互的方式)。

当然,你也可以这样写:

User user = new User();

创建User类的实例,并将其赋值给相同类型的对象变量,但这在一开始就违背了定义单独接口的目的。

想象一下,如果一个人走进一家商店,要求买一个带电源开关的设备。你没有说你想要复印机、电视、吸尘器、台灯、华夫饼机还是其他什么东西。你要的是带电源开关的设备。你会希望店员给你一种只能用"带电源开关的设备"来形容的东西吗?

典型的接口类似于"带有电源开关的设备"的描述。知道一件设备是"一个有电源开关的设备",就可以对它进行一些操作(即打开和关闭它),人们可能想要一个清单。"具有电源开关的设备在一天结束时需要关闭",除了具有电源开关之外,设备不必共享任何特性,但这种情况通常仅适用于为某些特定目的而创建的设备的一些常见操作。当你从零开始创造某样东西时,你更有可能想要一个"复印机"、"电视机"、"吸尘器"或其他特定类型的设备,而不是一些随机的"带电源开关的设备"。

在某些情况下,人们可能需要一个定义模糊的对象,并且真的不关心它到底是什么。"给我最便宜的能烧水的设备"。如果有人能够明确规定,当某人要求一个具有"烧水"能力的任意对象时,他们应该得到一个Acme 359电水壶,并且当使用类时,确实可以做到这一点。但是请注意,如果有人要"烧水装置",他们得到的不是"烧水装置",而是"Acme 359电水壶"。

IUser是接口,你不能实例化接口。

你需要实例化实现接口的具体类。

IUser user = new User();

User user = new User();

不能实例化接口或抽象类。

那是因为它没有任何逻辑。

接口为类中应该存在的方法提供了契约,而不需要实现。(所以在接口中没有实际的逻辑)。

抽象类提供类的基本逻辑,但不是完整的功能(不是所有的东西都实现了)。同样,你不能对它做任何操作

不能实例化抽象类或接口。如果它是一个抽象类,你必须继承它;如果它是一个接口,你必须实现它。例如

...
private class User : IUser
{
  ...
}
User u = new User();

这就是它所说的,你只是不能实例化一个抽象类。你需要先实现它,然后实例化那个类。

IUser user = new User();