调用 child child 中的方法 class

Call a method in child of child class

我有三个 class。首先是抽象,被child继承,class又被继承。如何从抽象的第三个class调用方法?

示例代码:

public abstract class DoSth
{
    public void DoSomething()
    {
        Console.WriteLine("I'm doing something");
        this.DoSomethingBigger();
    }
    protected abstract void DoSomethingBigger();
}

public class Writer : DoSth
{
    protected override void DoSomethingBigger()
    {
        Console.WriteLine("I'm writting");
    }
}

public class BookWriter : Writer
{
    protected new void DoSomethingBigger()
    {
        Console.WriteLine("I'm writting a book");
    }
}

如何从 BookWriter class 调用 DoSomethingBigger()? 当我创建 BookWriter 的实例并调用 DoSomething() 时,我的输出是

I'm doing something
I'm writting

但我想要

I'm doing something
I'm writting a book

通过使用 new 关键字标记 DoSomethingBigger 方法,您可以隐藏初始 DoSomethingBigger 方法而不是覆盖它。

您应该以这种方式重写您的代码才能正常工作

public abstract class DoSth
{
    public void DoSomething()
    {
        Console.WriteLine("I'm doing something");
        this.DoSomethingBigger();
    }
    protected abstract void DoSomethingBigger();
}

public class Writer : DoSth
{
    protected override void DoSomethingBigger()
    {
        Console.WriteLine("I'm writting");
    }
}

public class BookWriter : Writer
{
    protected override void DoSomethingBigger()
    {
        Console.WriteLine("I'm writting a book");
    }
}

您没有重写第 3 个 class 中的方法,您基本上是在创建一个基础一无所知的全新方法。有关详细信息,请参阅 here。这与将 BookWriter 中的方法名称更改为完全不同的名称(例如 DoSomethingElseAltogether())没有什么不同,现在更明显的是您不能从基础 class.[=14= 中调用它]

相反,您应该在第三个 class:

中覆盖
public class BookWriter : Writer
{
    protected override void DoSomethingBigger()
    {
        Console.WriteLine("I'm writting a book");
    }
}