在C#中,子类对象如何直接调用被重写的超类方法?

在C#中,子类对象如何直接调用被重写的超类方法?,c#,oop,C#,Oop,今天我在C#中学习了一些面向对象的概念,在学习的过程中我发现 子类对象能够直接从其被重写的超类调用方法,我熟悉Java,在Java中,如果一个方法是从其子类重写的 如果一个子类对象调用同一个方法,则执行子类中存在的方法,而不是超类方法,我们使用“super”关键字 我的问题是C#如何提供这样的特性,直接允许子类对象执行被重写的超类方法 下图是子类对象“obj”允许我使用的代码 通过提供“void super.display”选项调用super类方法display 使用base.MethodNam

今天我在C#中学习了一些面向对象的概念,在学习的过程中我发现 子类对象能够直接从其被重写的超类调用方法,我熟悉Java,在Java中,如果一个方法是从其子类重写的 如果一个子类对象调用同一个方法,则执行子类中存在的方法,而不是超类方法,我们使用“super”关键字

我的问题是C#如何提供这样的特性,直接允许子类对象执行被重写的超类方法

下图是子类对象“obj”允许我使用的代码 通过提供“void super.display”选项调用super类方法display

使用
base.MethodName()

但是您需要将父方法定义为
virtual
,并
重写子类中的方法。你不是按照你的形象做的


从图中可以看出,您没有重写基类中的方法,而是重写了基类中的方法

使用方法隐藏,您不能像屏幕截图中那样从子类调用基类方法:

来自屏幕截图的代码

Sub obj = new Sub();
obj.display();// this will call the child class method
intellisence中对
Super.display
的引用可能有缺陷,不能像这样从基类调用隐藏方法

(由于方法隐藏,您还应该得到一个警告,提示您使用
new
关键字)

要实现正确的重写,基类中的方法必须是
virtual
abstract
,例如:

public class Super
{
    public virtual void display()
    {
        Console.WriteLine("super/base class");
    }
}

public class Sub : Super
{
    public override void display()
    {
        Console.WriteLine("Child class");
    }
}
然后你可以这样称呼它:

Super obj = new Sub();
obj.display(); //child class

Super objSuper = new Super();
objSuper.display(); //base class method
如果要从子类内部调用基类方法,请使用
base
关键字,如:

public override void display()
{
    base.display();
    Console.WriteLine("Child class");
}

没有超级关键字,但我认为您需要
base
keyword@M.kazemAkhgary我说的是java中的super关键字,而不是C#将来总是以文本形式发布代码,不再以图像形式发布。
public override void display()
{
    base.display();
    Console.WriteLine("Child class");
}