如何始终调用当前类的构造函数,即使在派生类中?

时间:2013-09-25 20:41:43

标签: c# class oop inheritance polymorphism

如果我运行以下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
        }
    }
}

2 个答案:

答案 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(),它会调用它的构造函数。