zoukankan      html  css  js  c++  java
  • 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());  
    }  
    } 
  • 相关阅读:
    LeetCode Array Easy 414. Third Maximum Number
    LeetCode Linked List Medium 2. Add Two Numbers
    LeetCode Array Easy 283. Move Zeroes
    LeetCode Array Easy 268. Missing Number
    LeetCode Array Easy 219. Contains Duplicate II
    LeetCode Array Easy 217. Contains Duplicate
    LeetCode Array Easy 189. Rotate Array
    LeetCode Array Easy169. Majority Element
    LeetCode Array Medium 11. Container With Most Water
    LeetCode Array Easy 167. Two Sum II
  • 原文地址:https://www.cnblogs.com/grj001/p/12224871.html
Copyright © 2011-2022 走看看