• C# virtual修饰符


    C# virtual修饰符

    摘要:C#是继C++和Java语言后的又一面向对象的语言,在语法结构,C#有很多地方和C++及Java相似,但是又不同于它们,其中一些关键特别需要引起我们的注意。

    C# virtual修饰符用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。
    虚拟成员的实现可由派生类中的重写成员更改
    调用虚方法时,将为重写成员检查该对象的运行时类型。
    将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。


    默认情况下,方法是非虚拟的。不能重写非虚方法。
    不能将C# virtual修饰符与以下修饰符一起使用:
    static   abstract   override
    除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
        ◆在静态属性上使用C# virtual修饰符是错误的。
        ◆通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。

        上边是微软的官方说明,个人认为,如果自己觉得这个方法通用性不强就用virtual去声明这个方法,然后用户可以根据自己不同的情况首先继承它然后对它进行重载。下面我们来看一下微软给的例子:

        示例

        在该示例中,Dimensions 类包含 x 和 y 两个坐标和 Area() 虚方法。不同的形状类,如 Circle、Cylinder 和 Sphere 继承 Dimensions 类,并为每个图形计算表面积。每个派生类都有各自的 Area() 重写实现。根据与此方法关联的对象,通过调用正确的 Area() 实现,该程序为每个图形计算并显示正确的面积。

    // cs_virtual_keyword.cs  
    // Virtual and override  
    using System;  
    class TestClass   
    {  
    public class Dimensions   
    {  
    public const double pi = Math.PI;  
    protected double x, y;  
    public Dimensions()   
    {  
    }  
    public Dimensions (double x, double y)   
    {  
    this.x = x;  
    this.y = y;  
    }  
    
    public virtual double Area()   
    {  
    return x*y;  
    }  
    }  
    
    public class Circle: Dimensions   
    {  
    public Circle(double r): base(r, 0)   
    {  
    }  
    
    public override double Area()   
    {   
    return pi * x * x;   
    }  
    }  
    
    class Sphere: Dimensions   
    {  
    public Sphere(double r): base(r, 0)   
    {  
    }  
    
    public override double Area()  
    {  
    return 4 * pi * x * x;   
    }  
    }  
    
    class Cylinder: Dimensions   
    {  
    public Cylinder(double r, double h): base(r, h)   
    {  
    }  
    
    public override double Area()   
    {  
    return 2*pi*x*x + 2*pi*x*y;   
    }  
    }  
    
    public static void Main()    
    {  
    double r = 3.0, h = 5.0;  
    Dimensions c = new Circle(r);  
    Dimensions s = new Sphere(r);  
    Dimensions 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());  
    }  
    } 
  • 相关阅读:
    java学习第六天
    java学习第五天
    java学习第四天
    java学习第三天
    java学习第二天
    java学习第一天
    性能测试学习第十三天_性能测试报告编写
    性能测试学习第十二天_性能分析
    性能测试学习第十一天_Analysis
    性能测试学习第十天_controller
  • 原文地址:https://www.cnblogs.com/grj001/p/12224870.html
Copyright © 2020-2023  润新知