• C# 读书笔记之访问虚方法、重写方法和隐藏方法


    C#允许派生类中的方法与基类中方法具有相同的签名:基类中使用关键字virtual定义虚方法;然后派生类中使用关键字override来重写方法,或使用关键字new来覆盖方法(隐藏方法)。

    重写方法用相同的签名重写所继承的虚方法。虚方法声明用于引入新方法,而重写方法或隐藏方法声明则是用于使现有的继承虚方法专用化(通过提供该方法的新实现)

    注意:如果签名相同的方法在基类和派生类都进行了声明,但该方法没有声明为virtual和override/new,则派生类方法就会隐藏基类方法,但系统编译时会产生警告信息。因为隐藏方法会存在为给定类的实例调用错误方法的危险,故应该显示地定义隐藏方法。

    调用虚方法时,将首先检查该对象的运行时类型,并调用派生类中的该重写成员。如果没有派生类重写该成员,则调用其原始数据。

    默认情况下,C#方法是非虚拟的。不能重写非虚方法,重写非虚方法将导致编译错误。

    除了类方法外,还可以使用virtual关键字其他类成员以定义虚成员,包括属性【无参属性】、索引器【含参属性】或事件声明。虚拟成员的实现可在派生类使用关键字override来重写;或使用关键字new来覆盖。

    注意:virtual 修饰符不能与static、abstract、private或override修饰符一起使用。

    例:

    虚方法,重写方法和隐藏方法示例:Dimensions类包含x,y两个坐标和Area()虚方法。Dimensions类的派生类(Circle、Cylinder和Sphere)均重写了基类的虚方法Area()以实现不同图形表面积的计算。调用虚方法Area()时,将根据此方法关联的运行时对象调用适当的Area()实现,为每个图形计算并显示适当的面积。

       1:  namespace ConsoleApplication2
       2:  {
       3:   
       4:   
       5:   
       6:      public class Dimensions
       7:      {
       8:   
       9:          public const double PI = Math.PI;
      10:          protected double x, y;
      11:          public Dimensions()
      12:          {
      13:   
      14:          }
      15:   
      16:          public Dimensions(double x, double y)
      17:          {
      18:              this.x = x;
      19:              this.y = y;
      20:          }
      21:   
      22:          public virtual double Area()
      23:          {
      24:              return x * y;
      25:          }
      26:   
      27:      }
      28:   
      29:      public class Circle : Dimensions          //派生类:圆
      30:      {
      31:          public Circle(double r)
      32:              : base(r, 0)
      33:          {
      34:   
      35:          }
      36:   
      37:          public override double Area()
      38:          {
      39:              //园的面积
      40:              return PI * x * x;
      41:          }
      42:      }
      43:      public class Sphere : Dimensions          //派生类:球体
      44:      {
      45:          public Sphere(double r)
      46:              : base(r, 0)
      47:          {
      48:   
      49:          }
      50:   
      51:          public override double Area()
      52:          {
      53:              //球体的表面积
      54:              return 4 * PI * x * x;
      55:          }
      56:      }
      57:      public class Cylinder : Dimensions          //派生类:圆柱体
      58:      {
      59:          public Cylinder(double r)
      60:              : base(r, 0)
      61:          {
      62:   
      63:          }
      64:   
      65:          public override double Area()
      66:          {
      67:              //圆柱体的表面积
      68:              return 2 * PI * x * x + 2 * PI * x * y;
      69:          }
      70:      }
      71:   
      72:      public class Program
      73:      {
      74:   
      75:   
      76:          static void Main(string[] args)
      77:          {
      78:              double r = 3.0, h = 5.0;
      79:              Dimensions c = new Circle(r);           //圆
      80:   
      81:              Dimensions s = new Sphere(r);           //球体
      82:   
      83:   
      84:              Dimensions l = new Cylinder(r);         //圆柱体
      85:   
      86:              //显示各种不同形状的表面积
      87:   
      88:              Console.WriteLine("圆的面积={0:f2}",c.Area());
      89:              Console.WriteLine("球体的面积={0:f2}", s.Area());
      90:              Console.WriteLine("圆柱体的面积={0:f2}", l.Area());
      91:              Console.ReadKey();
      92:          }
      93:      }
      94:  }
  • 相关阅读:
    DataList小结(转载)
    ISAPI筛选器及对ASP源文件的保护
    VC中静态变量Static
    其他
    Android TabHost的使用
    有关Android线程的学习
    android 中LayoutInflater 的使用
    Java与VC中的基本数据类型的相关知识
    Java中的finalize()、final、fianlly
    Animations介绍及实例
  • 原文地址:https://www.cnblogs.com/jlcoder/p/3515316.html
Copyright © 2020-2023  润新知