为什么界面不能有构造函数?

时间:2015-02-03 19:36:59

标签: c#

我一直都有这个问题。接口强制实现者类具有特定的方法,属性或事件。但是为什么它不能强制实现者类具有特定的构造函数呢?

例如:

interface IX
{
    ctor(int val);

    string Foo();
}

..这意味着每个实现IX的类都应该有一个int作为参数的构造函数。

使用它并不简单,这只能保证如果一个类实现了IX接口,那么开发团队中没有人忘记将该构造函数放在他的类中。考虑这些类通过反射或Activator实例化的情况。

6 个答案:

答案 0 :(得分:2)

接口的要点是定义一组可以从界面使用的成员。

如果在接口中声明函数或属性,则可以在声明为该接口的任何变量上调用该函数或属性。

相比之下,使用在接口上声明的构造函数永远不会有任何方法。

答案 1 :(得分:0)

由于多态性,我认为强迫构造函数不利 在一个界面中。这是我首先想到的。

答案 2 :(得分:0)

因为施工高度依赖于实施。没有理由指定一种可以使结构统一的方法。如果要实例化,则需要实例化一个类,然后在提供的特定构造函数中进行选择。由于你无法实现界面,提供construtor签名的意思是什么?

答案 3 :(得分:0)

可以。但是,界面只是履行合同 - 实施如何履行合同并不重要。强制实现者有一个特定的构造函数在他们的实现中不必要地限制它们,并没有任何好处 - 如果你想强制某些参数来构造一个对象,那么让它们实现工厂方法会更容易和更灵活。 p>

答案 4 :(得分:0)

接口没有构造函数,因为接口不是任何东西的实例,并且没有任何构造。实现接口的某种类型在您创建它的实例时会被构造,因此它可以初始化其内部状态。

接口不表示或包含任何类型的内部状态(即使接口的某些成员公开来自实现它的类型的内部状态的数据),因此不需要(甚至意味着)运行构造函数用于界面。

修改:您的具体示例ctor(int val);假设所有实现IX的类型都有某种int成员变量,但这是一个实现细节。接口的目的是定义类型what,而不是how它可以做到。 IX在不同类型上的实现可能非常不同,只要它们都在内部提供满足接口的方式。

例如,考虑一个需要分隔字符串作为输入才能正常工作的类型:

class A : IX
{
    public A ( string sData ) { ... }

    // ...
}

满足int所需的IX可能是分隔字符串的一部分,但是,单个int构造函数不适用于此类:单个int不会无法传达正确操作此类所需的所有其他数据。

答案 5 :(得分:0)

当您将接口视为封装行为的方式而不是强加特定的实现时,那么在其中没有构造函数是完全有意义的。构造函数对封装行为没有影响,而是形成类的结构和类初始化的方式。