为什么我们不允许在接口中指定构造函数?
可能重复:
定义构造函数签名的接口?
我知道你不能在.Net的接口中指定一个构造函数,但为什么我们不能呢?
对于我目前的项目来说,能够指定必须使用构造函数传入一个“引擎”是非常有用的,但是因为我不能,所以我必须对该类有一个XML注释。
因为接口描述行为。 构造函数不是行为。 如何构build一个对象是一个实现细节。
你将如何调用构造函数? 当你使用接口的时候,你通常会传递一个接口实例(或者说引用)。 另外请记住,如果一个类实现了一个接口,派生类将inheritance该接口,但可能不具有相同的一组构造函数。
现在,我可以看到使用静态接口来指定构造函数和其他基本静态成员以用于generics方法。 有关更多信息,请参阅我的博客文章 。
不,你不能在已经发布的原因的接口上有构造函数。 不过你可以抽象类。 比方说,你有这个基类。
public abstract class ClassOne { protected int _x; protected string _s; public ClassOne(int x, string s) { _x = x; _s = s; } }
注意没有没有参数的构造函数(默认构造函数),这意味着任何从ClassOneinheritance的类都必须调用具有2个参数的构造函数。
所以这是无效的,不会编译。
public class ClassTwo : ClassOne { public ClassTwo() { } }
然而这是有效的,将编译。
public class ClassTwo : ClassOne { public ClassTwo(int x, string s) : base(x, s) { } }
我想在这里指出,在C#中,你只能从一个基类inheritance。 这意味着这可能不是针对特定情况的正确解决scheme,但需要考虑。
托尼。
在已经发布的所有其他原因中,请记住一个类可以轻松实现多个接口; 应该使用哪个构造函数呢?
其他答案已经指出为什么在接口上有一个构造函数声明是没有意义的。 但是从你的问题来看,我猜你可能正在寻找抽象工厂模式 。
举一个基于你的问题的例子:你说你想以某种方式声明一个“引擎”必须传递给构造函数。 你可以通过为build筑服务声明一个单独的界面来做到这一点:
public interface IGadgetFactory { IGadget CreateGadget(Engine engine); }
任何必须创buildIGadget
实例的代码都可以使用IGadgetFactory
实例,而不是直接调用任何构造函数。
因为你不能实例化一个接口,所以一个构造者是有道理的。
除了这里给出的其他解释之外,你还是必须发明一个新的语法来调用它们,因为如果你有两个或两个以上的实现,
Dim x as new IDoStuff()
Whice实现被调用?