2015-03-18 27 views
2

例如,我有一个基类和一些子类,B和C是否可以创建构造函数的模板?

public class A 
{ 
    protected string data; 
    public A(string s) 
    { 
     this.LoadFromString(s); 
    } 
    public virtual void LoadFromString(string s) 
    { 
     data = s; 
    } 
    public static T CreateInstance<T>(string s) where T : A, new() 
    { 
     T instance = new T(); 
     instance.LoadFromString(s); 
     return instance; 
    } 

} 
public class B : A 
{ 

} 

public class C : A 
{ 

} 

现在我想B和C的情况下,

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "111"; 
     //works 
     B bb = B.CreateInstance<B>(s); 
     //do not work 
     C cc = new C(s); 
     //do not work 
     C cc = C.CreateInstance(s); 
    } 
} 

是否可以界定一个东西让最后一个声明工作?

+0

只是你知道,它的“泛型”在C#中。模板是一个“C++”概念,它们的工作方式稍有不同 – BradleyDotNET 2015-03-18 22:47:57

+0

另外请注意,您的'B bb = B.Create ...'行不能像写入一样工作。 B类不会按原样编译。 – 2015-03-18 22:52:00

回答

1

是否可以在A中定义某些内容以使最后一条语句正常工作?

号你需要做的东西在C(添加一个构造函数),使第二个选项工作:

public class C 
{ 
    // Note that this is required anyways - it won't compile without 
    // a constructor that calls into base(string) anyways... 
    public C() : base("") {} 

    // This constructor will allow you to use new C(str) 
    public C(string s) : base(s) {} 
} 

为了使第三个选项的工作,你需要指定类型:

C cc = C.CreateInstance<C>(); 

这是因为C.CreateInstance实际上是完全一样在这种情况下A.CreateInstance,因此上述被编译成同样的事情:

C cc = A.CreateInstance<C>(); 

在C#中没有办法创建针对构造函数(除new()约束,它需要无参数构造函数)的泛型约束。

相关问题