现在的位置: 首页 > 综合 > 正文

virtual (c#参考)

2013年04月27日 ⁄ 综合 ⁄ 共 1332字 ⁄ 字号 评论关闭

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# 编程指南)

抱歉!评论已关闭.