为什么我们不允许在接口中指定构造函数?

Pon*_*dum 51 .net c# vb.net oop

可能重复:
定义构造函数签名的接口?

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

对于我当前的项目来说,能够指定必须使用构造函数传入"引擎"非常有用,但是我不能满足于对类的XML注释.

cle*_*tus 89

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

  • 我认为这给实现细节带来了太多意义:.NET中的构造函数实际上只是在创建对象后立即调用的方法(在内存中分配).没有理由不能将其定义为行为.当然,实现也可以自由地声明其他构造函数,就像它们可以重载实现接口的方法一样.接口中的构造函数将是一个很少使用的功能,但不是一个无用的功能. (26认同)

Jon*_*eet 28

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

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


Ton*_*ony 9

不,由于已发布的原因,您不能在接口上拥有构造函数.但是你可以在抽象类上.可以说比如你有这个基类.

public abstract class ClassOne
{
    protected int _x;
    protected string _s;

    public ClassOne(int x, string s)
    {
        _x = x;
        _s = s;
    }        
}
Run Code Online (Sandbox Code Playgroud)

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

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

public class ClassTwo : ClassOne
{
    public ClassTwo() 
    { }
}
Run Code Online (Sandbox Code Playgroud)

但是这是有效的并且将编译.

public class ClassTwo : ClassOne
{
    public ClassTwo(int x, string s) : base(x, s)
    {  }
}
Run Code Online (Sandbox Code Playgroud)

我想在此指出,在C#中,您只能从一个基类继承.这意味着这可能不是特定情况的正确解决方案,但需要考虑.

托尼.


M.T*_*ini 8

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


Wim*_*nen 6

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

举一个基于你的问题的例子:你说你想以某种方式声明必须将'引擎'传递给构造函数.您可以通过为这样的构造服务声明一个单独的接口来完成此操作:

public interface IGadgetFactory
{
   IGadget CreateGadget(Engine engine);
}
Run Code Online (Sandbox Code Playgroud)

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