因为接口描述了行为.构造函数不是行为.如何构建对象是一个实现细节.
因为接口描述了行为.构造函数不是行为.如何构建对象是一个实现细节.
你怎么称呼构造函数?使用接口时,通常会传递接口的实例(或者更确切地说是引用).还要记住,如果一个类实现了一个接口,派生类将继承该接口,但可能没有相同的一组构造函数.
现在,我可以看到使用我所谓的静态接口来指定构造函数和其他基本上静态的成员,以便在泛型方法中使用.有关详细信息,请参阅我的博客文章.
不,由于已发布的原因,您不能在接口上拥有构造函数.但是你可以在抽象类上.可以说比如你有这个基类.
public abstract class ClassOne { protected int _x; protected string _s; public ClassOne(int x, string s) { _x = x; _s = s; } }
请注意,没有构造函数不带参数(默认构造函数),这意味着任何继承自ClassOne的类必须调用具有2个参数的构造函数.
所以这是无效的,不会编译.
public class ClassTwo : ClassOne { public ClassTwo() { } }
但是这是有效的并且将编译.
public class ClassTwo : ClassOne { public ClassTwo(int x, string s) : base(x, s) { } }
我想在此指出,在C#中,您只能从一个基类继承.这意味着这可能不是特定情况的正确解决方案,但需要考虑.
托尼.
在已发布的所有其他原因中,还要记住一个类可以轻松实现多个接口; 应该使用哪个构造函数呢?
其他答案已经指出为什么在接口上有构造函数声明没有意义.但是从你的问题来看,我猜你可能正在寻找抽象的工厂模式.
举一个基于你的问题的例子:你说你想以某种方式声明必须将'引擎'传递给构造函数.您可以通过为这样的构造服务声明一个单独的接口来完成此操作:
public interface IGadgetFactory { IGadget CreateGadget(Engine engine); }
任何必须创建IGadget
实例的代码都可以使用IGadgetFactory
实例而不是直接调用任何构造函数.