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

时间:2015-10-27 17:43:41

标签: c# oop

我今天在C#中学习了一些OOP概念,在学习的同时我发现了一个 sub class Object能够直接从被覆盖的超类中调用一个方法,我熟悉Java,如果一个方法被覆盖了 超类,如果一个子类对象调用相同的方法,那么执行子类中存在的那个,而不是超级方法,我们使用" super"关键词。

My Que是C#如何提供这样的功能,直接允许子类对象执行被覆盖的超类方法

下面的图像是子类对象" obj"允许我 通过提供选项" void Super.display"

来调用超类方法显示

Image of Code

2 个答案:

答案 0 :(得分:6)

使用base.MethodName()

但您需要将父方法定义为virtual,并将override定义为子类中的方法。你不是根据你的形象做到这一点

请参阅this example

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
    */

答案 1 :(得分:1)

从图像中,您没有override基类中的方法,而是hiding the method

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

来自屏幕截图的代码。

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

在intellisence中对Super.display的引用可能是错误的,你不能像这样从基类调用隐藏方法。

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

要实现正确的覆盖,基类中的方法必须为virtualabstract,如:

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");
}