是否可以设置实现接口的所有类必须具有的约束,例如,空构造函数?与泛型中的where T : new()
约束一样?
答案 0 :(得分:5)
否 - 不可能对给定接口的派生类或实现者施加任何此类约束。
这种约束通常不会是一个特别好的主意/有用,因为通常在使用接口时,您通常使用实现该接口的对象实例,在这种情况下,对象自然已经被创建并且这样的约束是多余的。 (当然是泛型的例外,在这种情况下,您可以使用new()
约束)。
我的猜测是你试图创建某种插件系统,并希望限制你的插件接口的实现,以便有一些你可以用来实例化的默认构造函数......如果是这种情况那么通常会更好您可以使用的替代方案,例如MEF。
你能详细说明你为什么需要这个吗?
答案 1 :(得分:1)
不,没有那样的。这有点奇怪,因为接口的正常使用是使用接口的代码不需要关心它是如何被实例化的 - 它们不应该关心实现类是什么,只是它实现了接口
如果你有一些特殊的用途,我建议你只为它编写单元测试 - 如果所有的实现都在同一个程序集中,那么这样做应该非常简单,并且会在几乎与编译时间相同......
答案 2 :(得分:1)
我只能想到四种方法,你可能会在运行时获得一个在编译时不知道的类。您可能会获得一个实现接口的对象实例,并希望生成另一个类似的接口。最好通过使接口包含NewSimilarInstance()
方法来处理该场景。您可能在某个类中有一个方法,该方法会传递一个受限于您的接口的泛型类型参数。在该场景中,接受泛型参数的例程可能具有new()
约束。否则,您可以为该类型提供.net System.Type
对象或其他表示形式(如此字符串)。在后两种情况下,编译时验证没有意义;对类型执行任何操作都需要反射,因此您也可以使用Reflection来查看它们是否允许创建新实例。
答案 3 :(得分:0)
我认为您需要使用虚拟类。
答案 4 :(得分:0)
正如Justin所说,不仅你不能使用接口约束构造函数签名,而且也不可能使用抽象类。 也许如果你能解释为什么你需要设置这样的约束,我们可以为你的问题找到一些其他解决方案
答案 5 :(得分:0)
将Factory注入可以实例化接口的泛型类,并删除new()约束。
类似的东西:
public interface IFactory<out T>
{
T CreateInstance();
}
public class GenericClass<T>
{
private readonly IFactory<T> _factory;
public GenericClass(IFactory<T> factory)
{
_factory = factory;
}
public DoSomething()
{
//...
T foo = _factory.CreateInstance();
//...
}
}