关于oop:在C#中,子类对象如何才能直接调用被覆盖的超类方法?

In C# how can a sub class object can directly call a super class method which is overridden?

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

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

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

Image of Code


使用base.MethodName()

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

请参阅此示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Person
    {
        protected string ssn ="444-55-6666";
        protected string name ="John L. Malgraine";

        public virtual void GetInfo()
        {
            Console.WriteLine("Name: {0}", name);
            Console.WriteLine("SSN: {0}", ssn);
        }
    }
    class Employee : Person
    {
        public string id ="ABC567EFG";
        public override void GetInfo()
        {
            // Calling the base class GetInfo method:
            base.GetInfo();
            Console.WriteLine("Employee ID: {0}", id);
        }
    }

    class TestClass
    {
        static void Main()
        {
            Employee E = new Employee();
            E.GetInfo();
        }
    }
    /*
    Output
    Name: John L. Malgraine
    SSN: 444-55-6666
    Employee ID: ABC567EFG
    */

从图中,您没有从基类中删除方法override,而是隐藏了该方法。

如果方法隐藏,则无法从子类调用基类方法,如屏幕截图中所示:

屏幕截图中的代码。

1
2
Sub obj = new Sub();
obj.display();// this will call the child class method

在intellisence中对Super.display的引用可能有问题,不能从这样的基类调用隐藏方法。

(另外,由于方法隐藏,您应该收到使用new关键字的警告)

要实现适当的重写,基类中的方法必须是virtualabstract类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Super
{
    public virtual void display()
    {
        Console.WriteLine("super/base class");
    }
}

public class Sub : Super
{
    public override void display()
    {
        Console.WriteLine("Child class");
    }
}

然后你可以这样称呼它:

1
2
3
4
5
Super obj = new Sub();
obj.display(); //child class

Super objSuper = new Super();
objSuper.display(); //base class method

如果要从子类内部调用基类方法,请使用base关键字,如:

1
2
3
4
5
public override void display()
{
    base.display();
    Console.WriteLine("Child class");
}