在抽象类中调用override方法

时间:2013-09-19 20:43:57

标签: c# generics abstract-class

我有一个问题。我尝试从抽象类AbstractGenericClass中的Program.cs启动覆盖Host方法。

public abstract class AbstractGenericClass<T>
{
    protected abstract void Host();

    public static void Start()
    {
        //add additional logic for all classes that use this

        try
        {
            ((AbstractGenericClass<T>) Activator.CreateInstance(typeof(T))).Host();

            Console.WriteLine("Works!");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Don't Works!");
        }
    }
} 

class AnotherClass
{
    public void DoSomething()
    {
        //NOP
    }
}

class Program
    : AbstractGenericClass<AnotherClass>
{
    static void Main(string[] args)
    {
        Program.Start();

        Console.ReadLine();
    }

    protected override void Host()
    {
        Console.WriteLine("Host running...");
    }
}

我在这里添加了我创建的所有示例类,用于显示我的意思。该行((AbstractGenericClass)Activator.CreateInstance(typeof(T)))。Host(); 由于InvalidCastException导致程序崩溃。必须可以调用Host方法,但我不知道我怎么能这样做,如果这不运行。

您还有其他想法如何运作吗?或者这是我完全错误的尝试吗?

2 个答案:

答案 0 :(得分:1)

替换

((AbstractGenericClass<T>) Activator.CreateInstance(typeof(T))).Host();

Host();

因为Host()是一个抽象方法,Program.Start()将在派生类中调用此方法的实现,因此它将从Host()执行Program的实现。

答案 1 :(得分:0)

您不能将CreateInstance的结果转换为AbstractGenericClass,因为它的类型为AnotherClass,它不是从AbstractGenericClass派生的,并且无论如何都没有Host方法。听起来你想要的是获得一个类型为Program的对象并在其上调用Host。