如果我运行以下C#代码,它只输出BaseClass() called
,这是可以理解的。但是,如果我希望BaseClass.CreateInstance()
始终返回正在调用的类的实例,即使这实际上是继承该方法的其他类,该怎么办?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Example
{
class BaseClass
{
public BaseClass()
{
Console.WriteLine("BaseClass() called");
}
public static BaseClass CreateInstance()
{
return new BaseClass();
}
}
class DerivedClass : BaseClass
{
public DerivedClass()
: base()
{
Console.WriteLine("DerivedClass() called");
}
}
class Program
{
static void Main(string[] args)
{
DerivedClass.CreateInstance();
Console.ReadLine(); //pause so output is readable
}
}
}
答案 0 :(得分:3)
你实际上并没有在DerivedClass
上调用它。编译器发现BaseClass
(而非DerivedClass
)上存在静态方法,并自动将其转换为对BaseClass.CreateInstance
的调用。
一种选择是使用泛型来处理这个问题:
public static T CreateInstance<T>() where T : BaseClass, new()
{
return new T();
}
这将允许你写:
DerivedClass dc = BaseClass.CreateInstance<DerivedClass>();
答案 1 :(得分:0)
你没有在你的DerivedClass
方法中创建CreateInstance
的实例,所以你没有回来,因此它的构造函数没有被调用。
如果你要做var bla = new DerivedClass()
,它会调用它的构造函数。