【问题标题】:Why do I get an error instantiating an interface?为什么我在实例化接口时会出错?
【发布时间】:2011-09-30 11:36:49
【问题描述】:

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

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

我的代码如下:

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(); 时出现错误:

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

我在这里做错了什么?

【问题讨论】:

  • 尝试实例化用户,而不是接口。

标签: c# oop class interface instantiation


【解决方案1】:

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

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

在某些情况下,人们可能想要一个定义模糊的对象,而实际上并不关心它到底是什么。 “给我你最便宜的可以烧水的设备”。如果有人可以指定当有人要求一个具有“水沸腾”能力的任意对象时,应该为他们提供一个 Acme 359 Electric Teakettle,并且确实在使用课程时可以做到这一点,那就太好了。但请注意,要求“烧水设备”的人不会得到“烧水设备”,而是“Acme 359 电热水壶”。

【讨论】:

    【解决方案2】:

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

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

    IUser user = new User();
    

    User user = new User();
    

    【讨论】:

    • 我想你的意思是你“不能”实例化接口?
    【解决方案3】:

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

    但是,您可以实例化一个类的实例,该类实现该接口(为其方法提供实现),在您的情况下是User 类.

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

    IUser user = new User();
    

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

    当然,你也可以写:

    User user = new User();
    

    它创建User 类的实例并将其分配给相同类型的对象变量,但这首先违背了定义单独接口的目的。

    【讨论】:

      【解决方案4】:

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

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

      接口提供了一个契约应该在一个类中的方法,没有实现。 (所以界面中没有实际的逻辑)。

      抽象类提供类的基本逻辑,但功能不完整(并非所有内容都已实现)。再说一遍,你将无法用它做任何事情。

      【讨论】:

        【解决方案5】:

        正如它所说,你不能实例化一个抽象类。您需要先实现它,然后实例化该类。

        IUser user = new User();
        

        【讨论】:

          【解决方案6】:

          您不能实例化抽象类或接口。如果它是抽象类,则必须继承它,如果它是接口,则必须实现它。例如

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

          【讨论】:

            猜你喜欢
            • 2019-09-07
            • 1970-01-01
            • 1970-01-01
            • 2021-01-04
            • 2016-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多