zoukankan      html  css  js  c++  java
  • virtual 修饰符 C# .NET

    virtual

     关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。

    例如,此方法可被任何继承它的类重写。

    (C#参考) 

    public virtual double Area() 

        return x * y;

    虚拟成员的实现可由派生类中的重写成员更改 

    调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,

    如果没有派生类重写该成员,则它可能是原始成员。 

    默认情况下,方法是非虚拟的。不能重写非虚方法。 

    virtual修饰符不能与static、abstract, private或override修饰符一起使用。除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。在静态属性上使用virtual修饰符是错误的。 通过包括使用override修饰符的属性声明,可在派生类中重写虚拟继承属性。 

    示例 

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

    在前面的示例中,注意继承的类Circle、Sphere和Cylinder都使用了初始化基类的构造函数,例如:public Cylinder(double r, double h): base(r, h) {} 

    这类似于C++的初始化列表。

    // cs_virtual_keyword.cs

    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;

            }

        }

        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.Are

    a()); 

            Console.WriteLine("Area of Sphere   = {0:F2}", s.Are

    a()); 

            Console.WriteLine("Area of Cylinder = {0:F2}", l.Ar

    ea());

        }

    输出 

    Area of Circle   = 28.27

    Area of Sphere   = 113.10

    Area of Cylinder = 150.80 

  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/macavalier/p/3367966.html
Copyright © 2011-2022 走看看