繁体   English   中英

使用“this”关键字调用基类fun()(当派生类是presen时)

[英]Call Base class fun() in using “this” keyword (when a derived class is presen)

我有以下代码片段

Class Parent
{
    public override String ToString()
    {
            return "in Parent";
    }

    public virtual void printer()
    {
           Console.write(this.ToString());
    }
}

Class Child : Parent
{
    public override String ToString()
    {
            return "in Derived";
    }

    public override void printer()
    { 
           base.printer();
           Console.write(this.ToString());
    }
}

在Main我有

Parent p = new Derived();
p.printer();

输出为“In Derived”2次。 这是预期的,因为调用了大多数重写方法。

但是,是否可以调用基类的ToString()方法,在这种情况下,而不是调用派生的基类?

可以使用new关键字来解决这个问题,而不是覆盖Child类中的ToString()。

然后,当您的对象被引用为Child (或Child的Child )时,ToString()将映射到Child.ToString() 当它被转换为基础对象(例如Parent )时,ToString()将映射到Parent.ToString()

我不认为这是必要的良好做法,尤其是使用ToString()函数。

编号表格MSDN:

调用虚方法时,将检查对象的运行时类型是否有覆盖成员。 如果没有派生类重写成员,则调用派生程度最大的类中的重写成员,该成员可能是原始成员。

因此,即使您转换为Parent ,该对象仍然是Child因此将应用override。 问题是你从已被覆盖的父类调用ToString() ,因此如果实例是Child ,则无法访问它。

解决它的一种方法是创建一个单独的私有函数,而不是使用ToString()

public class Parent
{
    public override String ToString()
    {
        return ToStringPrivate();
    }

    private string ToStringPrivate()
    {
        return "in Parent";
    }

    public virtual void printer()
    {
        Console.WriteLine(this.ToStringPrivate());
    }
}

public class Child : Parent
{
    public override String ToString()
    {
        return "in Derived";
    }

    public override void printer()
    {
        base.printer();
        Console.WriteLine(this.ToString());
    }
}

你必须在Child中添加一个新方法:

public override string BaseToString()
{
     return base.ToString();
}

我想您已经在原始问题代码中触及了解决方案。 您只需要直接调用base.ToString()。 您的base.printer()调用仍在调用this.ToString(),它将从Child类调用重写版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM