【问题标题】:accessing overridden method from derived class object从派生类对象访问重写的方法
【发布时间】:2020-03-06 06:51:41
【问题描述】:

是否可以使用派生类的对象访问已被覆盖的方法?

using System;


class Bclass
{
    public virtual int result(int a,int b)
    {
        return a + b;
    }
}
class Dclass:Bclass
{
    public override int result(int a, int b)
    {
        return a - b;
    }
}

public class Program
{

    static public void Main(string[] args)
    {
        Dclass obj1 = new Dclass();
        Console.WriteLine(obj1.result(10, 5));
    }

}

有没有办法将输出设为 15?

【问题讨论】:

标签: c#


【解决方案1】:

来自MSDN documentation:

需要覆盖修饰符来扩展或修改摘要或 继承的方法、属性、索引器的虚拟实现,或 事件。


override 修饰符旨在扩展virtual 函数的功能。当你在派生类对象的帮助下调用被覆盖的函数时,它会调用被覆盖的函数。

回答你的问题,

是否可以使用 派生类的对象?

  • 没有方法可以直接使用派生类对象调用虚方法

调用虚方法的方式:

方法一:

在派生类中创建一个新函数并从中调用base.result()

public int BaseResult(int a, int b)
{
    return base.result(a, b);
}

并使用派生类实例调用BaseResult()

  Dclass obj1 = new Dclass();
  Console.WriteLine(obj1.BaseResult(10, 5));

Try it online

方法二:

创建基类的实例并从此访问virtual 方法。

    Bclass obj2 = new Bclass();
    Console.WriteLine(obj2.result(10, 5));

【讨论】:

  • “没有没有方法可以直接使用派生类对象调用虚方法” - 有is
  • 感谢您的评论。在我的回答中,我说“没有没有方法可以直接使用派生类对象调用虚拟方法”。使用反射或使用其他我们可以称之为的技术。
  • 同意。我的目光停留在那个大胆的no上。
  • @Sinatr,我更新了我的答案并直接突出显示
【解决方案2】:

除非你出于某种原因需要将基方法声明为virtual,否则你也可以通过将派生类方法声明为new来实现你想要的,从而在通过派生的实例使用它时隐藏实现类。

同时,您仍然可以通过将对象强制转换为基类来访问基实现。

按照您提供的示例:

class Bclass
{
    public int result(int a,int b)
    {
        return a + b;
    }
}

class Dclass : Bclass
{
    public new int result(int a, int b)
    {
        return a - b;
    }

    public int BaseResult(int a, int b)
    {
        return base.result(a, b);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Dclass obj1 = new Dclass();
        Console.WriteLine(((Bclass)obj1).result(10, 5)); // 15
    }
}

有关overridenew 之间差异的更多信息,请参阅此MSDN article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多