virtual (c#参考)

virtual关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。这提供了一种使派生类可以包含与基类方法同名的方法的机制。

  • 使用virtual有以下几个要点:
  • 1、基类方法必须定义为virtual。
  • 2、如果派生类中的方法前面带有new关键字,则该方法被定义为独立于基类中的方法(也就是说与基类中的同名方法共存,但是基类的方法被隐藏了)。
  • 3、如果派生类中的方法前面带有override关键字,则派生类中的方法是对基类中的方法进行覆盖。
  • 4、如果派生类中的方法前面没有new或override,则默认是new,编译器会发出警告。
    5、可以在派生类中使用base关键字来访问基类中的方法。
  • 6、以上几条对属性、索引器和事件也适用。

当在类中指定方法时,如果有多个方法与调用兼容(例如,存在两种同名的方法,并且其参数与传递的参数兼容),则 C# 编译器将选择最佳方法进行调用。

示例:
class Sharp
{
    public virtual void area(int x, int y)
    {
        System.Console.WriteLine("Sharp.area():{0:F2}", x * y);
    }
}

class Rect : Sharp
{
public new void area(int x, int y)
{
System.Console.WriteLine("Rect.area():int:{0:F2}", x * y);
}

public void area(double x, double y)
{
System.Console.WriteLine("Rect.area():double:{0:F2}", x * y);
}
}
class Circle : Sharp
{
private static double PI = Math.PI;

public override void area(int x, int y)
{
System.Console.WriteLine("Circle.area():overide{0:F2}", PI * x * x);
}

public void area(double x, double y)
{
System.Console.WriteLine("Circle.area():double:{0}", PI * x * x);
}
}
class TestSuite
{
public static void Test()
{
Rect c1 = new Rect();
c1.area(1, 2);
c1.area(1.1, 2.2);

((Sharp)c1).area(1, 2);

Circle c2 = new Circle();
c2.area(1, 2);

((Sharp)c2).area(2, 2);

System.Console.ReadLine();
}
}

执行结果:
Rect.area():int:2.00
Rect.area():double:2.42
Sharp.area():2.00
Circle.area():double:3.14159265358979
Circle.area():overide12.57

参考:
virtual(C# 参考)
使用 Override 和 New 关键字进行版本控制(C# 编程指南)
了解何时使用 Override 和 New 关键字(C# 编程指南)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值