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

时间:2011-07-07 13:32:09

标签: c# oop class interface instantiation

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

  

无法创建抽象类或接口的实例

我的代码如下:

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();时,我收到错误:

  

无法创建抽象类或接口的实例

我在这里做错了什么?

6 个答案:

答案 0 :(得分:46)

错误消息似乎不言自明。您无法实例化接口的实例,并且已将IUser声明为接口。 (同样的规则适用于抽象类。)接口的重点是它不会任何事情 - 没有为其方法提供实现。

但是,可以实例化实现该接口的类的实例(为其方法提供实现),在您的情况下是{{1} } class。

因此,您的代码需要如下所示:

User

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

当然,你也可以写:

IUser

创建User user = new User(); 类的实例并将其分配给相同类型的对象变量,但这种方法首先违背了定义单独接口的目的。

答案 1 :(得分:36)

想象一下,如果有人进入商店并要求设备带电源开关。你没有说你是想要复印机,电视机,吸尘器,台灯,华夫饼机还是其他任何东西。您要求使用带电源开关的设备。您是否希望店员为您提供一些只能被描述为“带电源开关的设备”的东西?

典型的接口类似于“具有电源开关的设备”的描述。知道一件设备是“具有电源开关的设备”将允许人们对其进行一些操作(即打开和关闭它),并且可能有人想要一个例如“具有电源开关的设备需要在一天结束时关闭”,没有设备必须共享任何超出电源开关的特性,但这种情况通常仅适用于对创建的设备应用一些常见操作时用于更具体的目的。当从头开始创建一些东西时,人们更可能使用“复印机”,“电视”,“吸尘器”或其他特定类型的设备,而不是随机的“带电源开关的设备”。

在某些情况下,人们可能需要一个模糊定义的对象,而且实际上并不关心它究竟是什么。 “给我你最便宜的可以烧水的装置”。如果人们可以指定当有人要求具有“水煮”能力的任意物体时,他们应该被提供一个Acme 359电子茶壶,而且当使用课程时,它可以做到这一点。但请注意,有人要求“煮沸水的装置”不会被给予“煮沸水的装置”,而是“Acme 359电动茶壶”。

答案 2 :(得分:15)

IUser是接口,您无法实例化接口。

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

IUser user = new User();

User user = new User();

答案 3 :(得分:5)

您无法实例化接口或抽象类。

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

接口提供应该在类中的方法的合同,而不实现。 (所以界面中没有实际的逻辑)。

抽象类提供类的基本逻辑,但功能不完全(并非一切都已实现)。所以再一次,你将无法用它做任何事情。

答案 4 :(得分:2)

您无法实例化抽象类或接口。如果是抽象类,则必须继承它,如果是接口,则必须实现它。 e.g。

...
private class User : IUser
{
  ...
}

User u = new User();

答案 5 :(得分:0)

它说的是,你无法实例化一个抽象类。您需要先实现它,然后实例化该类。

IUser user = new User();