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

本文关键字:析构函数 构造函数 接口 不能 为什么 | 更新日期: 2023-09-27 18:06:48

我知道界面是工作的。当我开始在我的项目中编码时,我在脑海中产生了这种怀疑。谁能解释一下?

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

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

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

    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的构造函数,对于另一个类它将是另一个方法。

所以通常,如果你想用已知参数指定构造函数,尝试使用抽象基类。

我采用了另一种方法,"如果…"的问题。这是我的结论(来自我的博客):

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

2:一个类MyApp被定义并实现了IApp。

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

第三:给定的是第二个接口ICoolApp,它定义了一个构造函数"ctor(string) "

4: MyApp类实现了ICoolApp。==>类MyApp现在有两个构造函数"ctor(int)"answers"ctor(string)"。到目前为止一切顺利。

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

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

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

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

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

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

Interface没有任何初始化变量的功能。

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

因为接口既不能构造也不能销毁。这只是一个想法。一份合同。

接口的构造是声明&定义它。它们不是要实例化的对象。

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

但是,见鬼,我喜欢像Pascal和Ada这样的语言,它们都不遗余力地指定了一个正式的"接口",与"实现"分开。

无论其价值如何,从接口中排除构造函数(甚至构造函数定义)有几个实际的和理论上的原因。c#和Java的参数基本相同。这个链接很有启发性:

  • http://c2.com/cgi/wiki?JavaInterfacesCannotSpecifyConstructors

我非常同意这些观点:

  • http://zoom.z3950.org/bind/java/comment/constructor.html

可以定义一个静态类,其名称与接口类似,其中包括工厂方法或属性,以生成实现接口的类实例。这方面的例子包括Enumerable。空和比较器<>. default。我个人认为,如果有一种方法可以指定接口名可以用来引用静态成员,那将是很有帮助的(通过具有相同名称的接口和静态类,能够在接口中包含静态成员,能够将静态类指定为与接口"关联",或者其他)。不幸的是,我不知道任何。net语言中都有这样的功能;最好是使用名称相似的静态类(如IEnumerable/Enumerable和iccompparer/Comparer)。

顺便说一下,如果接口可以包含静态,那么一个很好的附加特性将是让它们为自己包含扩展方法。例如:

<>之前void SetBounds(int x, int y, int width, int height, BoundsSpecified指定);SetBounds(x, y,宽度,高度){。SetBounds(x, y, width, height, BoundsSpecified.All);}SetSize(int width, int height){。SetBounds(0,0, width, height, BoundsSpecified.Size);}之前

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

我也问过自己这个问题几次,现在我似乎想到了一个解释:

接口契约描述了对象做什么,而不是如何做。构造函数可能与How有更多的关系,所以这就是为什么我们不能把它作为契约的一部分。

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

Interface确实没有构造函数,因为他们不知道要用什么类型的派生类来实现它。

如果不希望编译器隐式地创建move操作,可以使用虚析构函数