【问题标题】:C# redefine sub-method in child class without redefining calling method in parent classC#在子类中重新定义子方法而不在父类中重新定义调用方法
【发布时间】:2019-07-22 14:10:23
【问题描述】:

我有一个父类,其中包含许多方法,它们都由一个顶级方法调用。

从概念上讲,父类如下所示:

class ParentClass
{
    void TopMethod(){ Lots of code and calls Methods1-N defined below}

    void Method1(){}
    void Method2(){}
    ...
    void MethodN(){}
}

我还有很多其他的类,我希望这些类只是这个基类的微小变化。 所以我声明它们继承自 ParentClass。 假设我需要做的就是更改子类中 Method1 的定义。 但是我如何告诉子类使用 ParentClass 中的所有其他内容,只需使用 Method1 的新定义。 特别是我不希望在子类中重写 TopMethod 的重复代码,这样我就可以让它使用子类中重新定义的 Method1 而不是 ParentClass 中的 Method1。

【问题讨论】:

  • 好吧,如果 Method1、Method2 等都是虚拟的,那么您只需在派生类中覆盖 Method1...
  • 您在父类中使您的方法为虚拟方法,并在需要时在继承的类中覆盖它们
  • 还要考虑对您的成员使用适当的访问修饰符(本例中的方法)。在您的示例代码中,默认情况下所有内容都是private,这意味着基类无法看到这些成员(或覆盖它们)。如果您想在派生类中访问基类的成员,您至少需要protected。如果你想定义一个新的实现,它也需要被标记为virtual
  • DavidG 的帖子是我想要做的——谢谢!我在子类中只使用“new”关键字,而不是在父类中使用“virtual”,在子类中使用“override”。

标签: c# inheritance


【解决方案1】:

您需要将Method1Method2 等设为虚拟并在子类中覆盖它们。例如:

public class ParentClass
{
    public void TopMethod()
    {
        Console.WriteLine("Top method in parent");
        Method1();
    }

    public virtual void Method1()
    {
        Console.WriteLine("Method1 in parent");
    }
}

public class ChildClass : ParentClass
{
    public override void Method1()
    {
        Console.WriteLine("Method1 in child");
    }
}

现在调用每个类:

var parent = new ParentClass();
var child = new ChildClass();

parent.TopMethod();
child.TopMethod();

会给你这个输出:

Top method in parent
Method1 in parent
Top method in parent
Method1 in child

【讨论】:

    【解决方案2】:

    来自文档:virtual keyword

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多