关于c#:为什么我们不允许在接口中指定构造函数?

Why are we not allowed to specify a constructor in an interface?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Interface defining a constructor signature?

我知道你不能在.NET的接口中指定构造函数,但是为什么我们不能呢?

对于我当前的项目来说,能够指定"引擎"必须与构造函数一起传入是非常有用的,但是由于我不能这样做,我必须对类使用XML注释。


因为接口描述了行为。构造函数不是行为。如何构建对象是一个实现细节。


如何调用构造函数?使用接口时,通常会传递接口的实例(或者更确切地说,是引用)。还要记住,如果一个类实现了接口,则派生类继承了该接口,但可能没有相同的构造函数集。

现在,我可以看到使用我所称的静态接口来指定构造函数和其他基本上静态的成员,以便在泛型方法中使用。有关详细信息,请参阅我关于该想法的博客文章。


不,由于已发布的原因,不能在接口上有构造函数。但是在抽象类上可以。例如,假设您有这个基类。

1
2
3
4
5
6
7
8
9
10
11
public abstract class ClassOne
{
    protected int _x;
    protected string _s;

    public ClassOne(int x, string s)
    {
        _x = x;
        _s = s;
    }        
}

注意,没有不带参数的构造函数(默认构造函数),这意味着从ClassOne继承的任何类都必须调用具有2个参数的构造函数。

所以这是无效的,不会编译。

1
2
3
4
5
public class ClassTwo : ClassOne
{
    public ClassTwo()
    { }
}

但是,这是有效的并将编译。

1
2
3
4
5
public class ClassTwo : ClassOne
{
    public ClassTwo(int x, string s) : base(x, s)
    {  }
}

我想在这里指出,在C中,您只能从一个基类继承。这意味着,这可能不是针对特定情况的正确解决方案,而是需要考虑的问题。

托尼。


在已经发布的所有其他原因中,还要记住,A类可以轻松实现几个接口;那么应该使用哪个构造函数呢?


其他答案已经指出了为什么在接口上有一个构造函数声明是没有意义的。但从你的问题来看,我猜你可能在寻找抽象的工厂模式。

基于您的问题给出一个示例:您说您希望以某种方式声明必须将"引擎"传递给构造函数。您可以通过为这样的构建服务声明一个单独的接口来实现这一点:

1
2
3
4
public interface IGadgetFactory
{
   IGadget CreateGadget(Engine engine);
}

任何必须创建IGadget实例的代码都可以使用IGadgetFactory实例,而不是直接调用任何构造函数。


除了这里给出的其他解释之外,您还必须发明一种新的语法来调用它们,因为如果您在该行的范围内有两个或多个实现:

1
Dim x as new IDoStuff()

调用哪个实现?


因为你不能实例化一个接口,所以一个构造是没有意义的。