【问题标题】:Call a method in child of child class在子类的子类中调用方法
【发布时间】:2019-01-05 10:43:55
【问题描述】:

我有三门课。首先是抽象的,它被子类继承,子类又被继承。如何从抽象类的第三类调用方法?

示例代码:

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 类调用DoSomethingBigger()? 当我创建 BookWriter 的实例并调用 DoSomething() 时,我的输出是

I'm doing something
I'm writting

但我想要

I'm doing something
I'm writting a book

【问题讨论】:

标签: c# .net abstract


【解决方案1】:

通过使用 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");
    }
}

【讨论】:

  • @Pavel 你不能在同一个方法签名中拥有virtualoverride。此代码无法编译。
  • 很高兴听到这个消息:)
【解决方案2】:

您并没有覆盖第三类中的方法,您基本上是在创建一个全新的方法,而基础对此一无所知。请参阅here 了解更多信息。这与将BookWriter 中的方法名称更改为完全不同的名称(如DoSomethingElseAltogether())没有什么不同,现在更明显的是,您不能从基类中调用它。

相反,您应该在第三类中覆盖:

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

【讨论】:

  • 我可以补充一下,您可能想base.DoSomething() 以确保它也能完成超类中的功能
  • @Persistence 也许,取决于您的用例。 OP 在中产阶级中没有,如果有,我认为这不是这里需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2013-07-07
  • 1970-01-01
  • 2021-05-13
相关资源
最近更新 更多