zoukankan      html  css  js  c++  java
  • virtual (C# Reference)

    The virtual keyword is used to modify a method, property, indexer or event declaration, and allow 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 on using the virtual 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 static, abstract, private or override modifiers.

    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 class Dimensions contains the two coordinates x, y, and the Area() virtual method. Different shape classes such as Circle, Cylinder, and Sphere inherit the Dimensions class, and the surface area is calculated for each figure. Each derived class has it own override implementation of Area(). The program calculates and displays the proper area for each figure by invoking the proper implementation of Area() according to the object associated with the method.

    Notice that the inherited classes Circle, Sphere, and Cylinder are all using constructors that initialize the base class, for example:

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

    This is analogous to the C++ initialization list.

    // 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.Area());
            Console.WriteLine("Area of Sphere   = {0:F2}", s.Area());
            Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
        }
    }
    
    Output

    Area of Circle   = 28.27
    Area of Sphere   = 113.10
    Area of Cylinder = 150.80
     
     
    Reference: http://msdn.microsoft.com/en-us/library/9fkccyh4(VS.80).aspx
  • 相关阅读:
    [pyqt] 基于特征匹配的动漫头像检索系统(一)
    [python] 简单遗传算法与粒子群算法
    [美化] 博客园美化历程
    [同人] 我的莱昂
    数据结构 结语
    灌水机
    Ubuntu 中linux 编译错误的(-)
    目标抓取全站妹子封面图片全部爬下来以图片标题命名
    Makefile 介绍
    Linux 中的 ~/. 表示的意思
  • 原文地址:https://www.cnblogs.com/sandy_liao/p/1893672.html
Copyright © 2011-2022 走看看