2010-04-16 130 views
7

我试图做到以下几点:为什么我不能强制派生类具有无参数构造函数?

class Program 
{ 
    static void Main(string[] args) 
    { 
     foo<baz> fooObject = new foo<baz>(); 
     AnotherClass<baz> _baz = new AnotherClass<baz>(); 
     _baz.testMethod(fooObject); 
    } 
} 

public class AnotherClass<T> where T : bar 
{ 
    public void testMethod(foo<T> dummy) 
    { 
     foobar = dummy; 
    } 

    private foo<T> foobar = null; 
} 

public class foo<T> where T : bar, new() 
{ 
    public foo() 
    { 
     _t = new T(); 
    } 

    private T _t; 

} 

public abstract class bar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 

public class baz : bar 
{ 
    public override void someMethod() 
    { 
     //Implementation 
    } 
}  

我得到一个错误解释,“T”必须是一个非抽象类有一个公共的无参数的构造函数,以便在将它用作参数“T”泛型类型或方法。我完全理解为什么必须这样做,也明白我可以传递一个类型为'T'的预初始化对象作为构造函数参数,以避免“新”出现,但是有没有办法解决这个问题?任何方式来强制派生从'酒吧'提供无参数构造函数的类?

固定 - 我错过了AnotherClass()上的new()约束。

回答

5

你是不是失踪的AnotherClass一个新的()的约束?

public class AnotherClass<T> where T : bar, new() 

没有这个VS2010拒绝编译,因为它工作得很好。从关键字“其中”类“富” 后

+0

谢谢,这似乎已经修好了! – 2010-04-16 21:49:37

0

是不是通用语法new()而不是新的?

而且,你这样做是在代码一类的中间,而不是在一个函数,这是一定要挡板它:

_t = new T(); 

编辑:

好了,所以后语法清理,我猜问题是'巴兹'没有无参数的构造函数。我不知道你有什么办法可以强制执行。

还有一个类似的问题here,这可能会有所帮助。

+0

“在课堂中间”:这只是一个带初始值的字段声明。 – 2010-04-16 09:03:43

+0

修好了,谢谢。我的半伪代码,半实际代码的坏习惯! – 2010-04-16 09:04:48

7

正确的语法是

public class foo<T> where T : bar, new() 
+0

对不起,我急于打字。 – 2010-04-16 09:05:47

0

像解决办法 - 你可以通过委托创建你需要一个类型的实例:

Func<T> creator = ... 

    _t = creator(); 
1

你的代码编译在VS2010。

你可能想使用的接口来代替:

public class foo<T> where T : ibar, new() 
... 

public interface ibar 
{ 
    void someMethod(); 
} 

public abstract class bar : ibar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 
+0

这对我产生同样的问题... – 2010-04-16 12:15:41

0

首先删除“新的()”必须改变构造函数

public foo() 
{ 
    _t = Activator.CreateInstance<T>(); 
} 

对我的工作!

相关问题