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

12 浏览
0 Comments

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

今天我在学习C#中的一些面向对象编程概念时发现,子类对象可以直接调用被覆盖的超类方法。我对Java很熟悉,其中如果一个方法被从超类覆盖,并且子类对象调用相同的方法,则执行的是子类中的方法,而不是超类的方法,为了实现这一点,我们使用"super"关键字。我的问题是,C#如何提供这样的功能,直接允许子类对象执行被覆盖的超类方法。下面的图片是代码示例,子类对象"obj"允许我通过选择"void Super.display"来调用超类方法display。

![代码示例图片](https://i.stack.imgur.com/hPric.jpg)

0
0 Comments

在C#中,如果子类对象直接调用重写的父类方法,需要注意以下几点。

首先,需要确保在基类中使用了override关键字来重写方法,而不是使用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(); // 输出:super/base class

如果想在子类中调用基类方法,可以使用base关键字,如下所示:

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

这样就可以先调用基类方法,然后再执行子类的方法。

总结起来,要实现子类对象直接调用重写的父类方法,需要使用override关键字来重写基类方法,确保基类方法是virtual或abstract,并使用base关键字在子类中调用基类方法。

0
0 Comments

在C#中,如果一个子类对象想要直接调用一个被重写的父类方法,可以使用`base.MethodName()`的方式。但是在使用之前,需要将父类方法定义为`virtual`,并在子类中使用`override`关键字重写该方法。根据你提供的信息来看,你似乎没有按照这种方式进行操作。

下面是一个示例代码,演示了如何使用`base.GetInfo()`来直接调用父类方法的情况:

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()
    {
        // 调用基类的GetInfo方法:
        base.GetInfo();
        Console.WriteLine("Employee ID: {0}", id);
    }
}
class TestClass
{
    static void Main()
    {
        Employee E = new Employee();
        E.GetInfo();
    }
}

运行上述代码,输出结果如下:

Name: John L. Malgraine
SSN: 444-55-6666
Employee ID: ABC567EFG

通过以上示例,我们可以看到子类`Employee`对象调用了父类`Person`的`GetInfo`方法,并在其基础上添加了自己的额外输出。这是通过在子类中使用`base.GetInfo()`来实现的。

0