为什么接口不能有构造函数和析构函数?

时间:2011-08-29 05:40:26

标签: c# interface constructor destructor

我知道界面正在运行。当我开始编写项目编码时,我心中就怀疑了。任何人都可以澄清吗?

9 个答案:

答案 0 :(得分:21)

接口是契约,而不是实现,因此不需要构造或销毁它们。您只构造和销毁可以实现接口的具体类型。

答案 1 :(得分:3)

据我所知,你想知道为什么我们不能指定构造函数的签名以及其他对象的方法,比如

    interface IApp
    {
         void App(int i, int j);
    }
    class App : IApp
    {
         // You want constructor to be only with 2 parameters
         public void App(int i, int j){ }
    }

无法完成,因为首先,所有接口方法都应该实现为public,但构造函数可以设置为private,而第二种方法 void App(..)将是构造函数仅适用于App类,对于另一个类,它将是另一种方法。

因此,通常,如果要指定具有已知参数的构造函数,请尝试使用抽象基类。

答案 2 :(得分:1)

接口定义的方法集可以由一个或多个类实现。它的抽象定义了合同。

接口不分配任何内存或实现任何方法

接口没有任何功能来初始化该变量。

答案 3 :(得分:0)

接口只是对象之间的契约。他们没有任何代码。赋予它们构造函数和析构函数将为它们提供运行代码。如果您需要在合同中进行初始化或清理,则添加Initialize()和Uninitialize()方法。

答案 4 :(得分:0)

因为界面无需构建或破坏。这只是一个想法。合同。

界面的构造是声明和宣传的行为。定义它。它们不是要实例化的对象。

答案 5 :(得分:0)

我同意接口是“合同”。就个人而言,我希望能够将构造函数签名指定为该合同的一部分。

但是,我喜欢像Pascal和Ada这样的语言,它们都竭尽全力指定一个正式的“界面”,与“实现”分开并区别开来。

无论它有什么价值,从接口中排除构造函数 - 甚至构造函数定义 - 都有几个实际和理论上的原因。对于C#,参数与Java基本相同。这个链接很有启发性:

我非常赞同这些观点:

答案 6 :(得分:0)

可以定义一个静态类,其名称类似于接口,包括工厂方法或属性,以生成实现接口的类实例。其示例包括Enumerable< T> .Empty和Comparer< T> .Default。我个人认为,如果有一种方法可以指定接口名称可用于引用静态成员(通过具有相同名称的接口和静态类,能够在接口中包含静态成员,能够将静态类指定为与interfafce“关联”,或者其他任何东西。不幸的是,我不知道任何.net语言的这种设施;最好的方法是使用一个名称相似的静态类(与IEnumerable / Enumerable和IComparer / Comparer一样)。

顺便提一下,如果接口可以包含静态,那么一个很好的奖励功能将是让它们包含自己的扩展方法的一种方法。例如:

  void SetBounds(int x, int y, int width, int height, BoundsSpecified specified);
  static void SetBounds(int x, int y, int width, int height)
    { It.SetBounds(x, y, width, height, BoundsSpecified.All); }
  static void SetSize(int width, int height)
    { It.SetBounds(0, 0, width, height, BoundsSpecified.Size); }

允许接口向其用户公开许多常见函数的重载版本,而不要求所有实现都包含实现它们所需的样板代码。

答案 7 :(得分:0)

我也问了几次这个问题,现在似乎有一种解释:

接口合同描述**对象的作用是什么,而不是** **如何做**。构造函数可能更多地与How有关,所以这就是为什么我们不能将它作为合同的一部分。

接口的客户端期望接收已构造的对象,因此它们不关心构造函数签名。至于将创建该对象的代码,它已经知道要创建什么具体对象,因此它知道构造函数签名。

答案 8 :(得分:0)

我做了另一种方法,"如果......"题。这是我的结论(from my blog):

1st:Given是一个接口IApp,它定义了一个构造函数" ctor(int)"。

2nd:定义了MyApp类并实现了IApp。

==>类MyApp现在有一个构造函数" ctor(int)"来自IApp

3rd:Given是第二个接口ICoolApp,它定义了一个构造函数" ctor(string)"

第4名:Class MyApp实现了ICoolApp。 ==>类MyApp现在有两个构造函数" ctor(int)"和" ctor(字符串)"。到目前为止一切都很好。

即使定义了相同签名的构造函数,显式实现也可以定义两种不同的方法来创建MyApp类(因为它已经与方法一起使用)。

第五:创建一个新的MyApp实例,调用" new MyClass(int)"。这个新实例是IApp和ICoolApp,因为它实现了两个接口。没问题,对吧?

==>错误! MyApp类有两个构造函数,但实例是通过调用IApp的构造函数创建的。构造函数" ctor(string)"实现ICoolApp创建对象的方式没有被调用。

作为结论,MyApp的实例既是IApp又是ICoolApp,但实例的创建只履行了一份合同,即IApp的合同。由于签名不同,在实例创建期间不可能同时履行这两个合同,尽管MyApp声称尊重/实施这两个合同。

相关问题