https://msdn.microsoft.com/en-us/library/9fkccyh4.aspx

The virtual keyword is used to modify a method, property, indexer, or event declaration and allow for it to be overridden in a derived class.

For example, this method can be overridden by any class that inherits it:

public virtual double Area()
{
return x * y;
}

The implementation of a virtual member can be changed by an overriding member in a derived class.

For more information about how to use thevirtual keyword,

see Versioning with the Override and New Keywords (C# Programming Guide)

and Knowing When to Use Override and New Keywords (C# Programming Guide).

Remarks

When a virtual method is invoked, the run-time type of the object is checked for an overriding member.

The overriding member in the most derived class is called, which might be the original member, if no derived class has overridden the member.

By default, methods are non-virtual. You cannot override a non-virtual method.

You cannot use the virtual modifier with the staticabstract, private, or override modifiers.

The following example shows a virtual property:

public class MyBaseClass
{
/// <summary>
/// virtual auto-implemented property.
/// Overrides can only provide specialized behavior if they implement get and set accessors.
/// </summary>
public virtual string Name { get; set; } private int number;
/// <summary>
/// ordinary virtual property with backing field
/// </summary>
public virtual int Number
{
get { return number; }
set { number = value; }
}
} public class MyDerivedClass : MyBaseClass
{
private string name;
/// <summary>
/// Override auto-implemented property with ordinary property to provide specialized accessor behavior.
/// </summary>
public override string Name
{
get
{
return name;
}
set
{
name = value.Equals(string.Empty) == false ? value : "Unknown";
}
}
}

Virtual properties behave like abstract methods, except for the differences in declaration and invocation调用 syntax.

  • It is an error to use the virtual modifier on a static property.

  • A virtual inherited property can be overridden in a derived class by including a property declaration that uses the override modifier.

Example

In this example, the Shape class contains the two coordinates x, y, and the Area() virtual method.

Different shape classes such as Circle, Cylinder, and Sphere inherit the Shape class, and the surface area is calculated for each figure.

Each derived class has it own override implementation ofArea().

Notice that the inherited classes Circle, Sphere, and Cylinder all use constructors that initialize the base class, as shown in the following declaration.

public Cylinder(double r, double h): base(r, h) {}

The following program calculates and displays the appropriate area for each figure by invoking the appropriate implementation of the Area()method, according to the object that is associated with the method.

 class TestClass
{
public class Shape
{
public const double PI = Math.PI;
protected double x, y;
public Shape()
{
}
public Shape(double x, double y)
{
this.x = x;
this.y = y;
} public virtual double Area()
{
return x * y;
}
} /// <summary>
/// 圆
/// </summary>
public class Circle : Shape
{
public Circle(double r) : base(r, )
{
} public override double Area()
{
return PI * x * x;
}
} /// <summary>
/// 球体
/// </summary>
class Sphere : Shape
{
public Sphere(double r) : base(r, )
{
} public override double Area()
{
return * PI * x * x;
}
} /// <summary>
/// 圆柱体
/// </summary>
class Cylinder : Shape
{
public Cylinder(double r, double h) : base(r, h)
{
} public override double Area()
{
return * PI * x * x + * PI * x * y;
}
} static void Method()
{
double r = 3.0, h = 5.0;
Shape c = new Circle(r);
Shape s = new Sphere(r);
Shape l = new Cylinder(r, h);
// Display results:
Console.WriteLine("Area of Circle = {0:F2}", c.Area());
Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
}
}

最新文章

  1. ImageSharp .NET Core跨平台图形处理库
  2. Codevs堆练习
  3. oracleDBA-D4
  4. Idea安装及简单配置
  5. Android 实例子源代码文件下载地址380个合集
  6. CodeForces #367 div2 C
  7. 转:MVC单表多按钮提交
  8. Python 2.7_Second_try_爬取阳光电影网_获取电影下载地址并写入文件 20161207
  9. call和apply的差别
  10. LA 3905 Meteor
  11. Core Java 学习笔记——2.基本数据类型&amp;类型转换
  12. 关于java的static关键字
  13. jquery全局加载函数的几种方式;
  14. LOL是什么意思? - 已解决 - 搜狗问问
  15. EF-Code First(5):二级缓存
  16. Google永远不可能回到国内,只能是回忆
  17. Vim的基本使用(二)
  18. Caused by: java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration
  19. JVM(三)对象的生死判定和算法详解
  20. Mesh无线网络的定义与WiFi的区别

热门文章

  1. 启发式合并CodeForces - 1009F
  2. 启发式合并 CodeForces - 600E
  3. Linux环境下验证码不显示F12报500
  4. CentOS虚拟机挂载Windows共享目录
  5. python爬取百度文库所有内容
  6. 集训第六周 数学概念与方法 概率 F题
  7. Mysql学习总结(43)——MySQL主从复制详细配置
  8. stl lower_bound()和up_bound()
  9. android listVIew实现button按钮监听程序
  10. 【BZOJ2301】Problem b(莫比乌斯反演)