[英]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 文章中找到有关override
和new
之间差异的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.