在抽象类中调用重写方法

本文关键字:重写 方法 调用 抽象类 | 更新日期: 2023-09-27 18:31:57

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

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)))的行。主机();由于InvalidCastException而使程序崩溃。必须可以调用 Host 方法,但如果这不起作用,我不知道我怎么能做到这一点。

您还有其他想法吗?还是我尝试的完全错误?

在抽象类中调用重写方法

替换

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

Host();

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

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