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

    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, 0)
                {
                }
    
                public override double Area()
                {
                    return PI * x * x;
                }
            }
    
            /// <summary>
            /// 球体
            /// </summary>
            class Sphere : Shape
            {
                public Sphere(double r) : base(r, 0)
                {
                }
    
                public override double Area()
                {
                    return 4 * PI * x * x;
                }
            }
    
            /// <summary>
            /// 圆柱体
            /// </summary>
            class Cylinder : Shape
            {
                public Cylinder(double r, double h) : base(r, h)
                {
                }
    
                public override double Area()
                {
                    return 2 * PI * x * x + 2 * 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());
            }
        }
  • 相关阅读:
    我看这篇对初学者很有帮助就转载了 Web.config (转载)
    自动开关机
    想换个地方了
    浅析软件项目管理中十个误区
    如何结束测试员和程序员之间的战争
    程序员四大忌 你该如何避免?(2006.01.13 来自:希赛)
    完整的变更请求管理解决方案
    情人节,我加班
    需求分析,你呀你!(源自Linuxaid.com.cn )
    转贴一篇对技术人员的十大忠告,希望新的一年有所提升!
  • 原文地址:https://www.cnblogs.com/chucklu/p/5258826.html
Copyright © 2011-2022 走看看