我今天在C#中学习了一些OOP概念,在学习的同时我发现了一个 sub class Object能够直接从被覆盖的超类中调用一个方法,我熟悉Java,如果一个方法被覆盖了 超类,如果一个子类对象调用相同的方法,那么执行子类中存在的那个,而不是超级方法,我们使用" super"关键词。
My Que是C#如何提供这样的功能,直接允许子类对象执行被覆盖的超类方法
下面的图像是子类对象" obj"允许我 通过提供选项" void Super.display"
来调用超类方法显示
答案 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
关键字的警告)
要实现正确的覆盖,基类中的方法必须为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");
}