繁体   English   中英

从派生类对象访问重写的方法

[英]accessing overridden method from derived class object

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

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?

来自MSDN 文档:

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


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

网上试试

方法二:

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

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

除非出于某种原因需要将基方法声明为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
    }
}

可以在这篇MSDN 文章中找到有关overridenew之间差异的更多信息。

暂无
暂无

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

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