C# 讀書筆記之訪問虛方法、重寫方法和隱藏方法

C#容許派生類中的方法與基類中方法具備相同的簽名:基類中使用關鍵字virtual定義虛方法;而後派生類中使用關鍵字override來重寫方法,或使用關鍵字new來覆蓋方法(隱藏方法)。html

重寫方法用相同的簽名重寫所繼承的虛方法。虛方法聲明用於引入新方法,而重寫方法或隱藏方法聲明則是用於使現有的繼承虛方法專用化(經過提供該方法的新實現)ide

注意:若是簽名相同的方法在基類和派生類都進行了聲明,但該方法沒有聲明爲virtual和override/new,則派生類方法就會隱藏基類方法,但系統編譯時會產生警告信息。由於隱藏方法會存在爲給定類的實例調用錯誤方法的危險,故應該顯示地定義隱藏方法。this

調用虛方法時,將首先檢查該對象的運行時類型,並調用派生類中的該重寫成員。若是沒有派生類重寫該成員,則調用其原始數據。spa

默認狀況下,C#方法是非虛擬的。不能重寫非虛方法,重寫非虛方法將致使編譯錯誤。code

除了類方法外,還能夠使用virtual關鍵字其餘類成員以定義虛成員,包括屬性【無參屬性】、索引器【含參屬性】或事件聲明。虛擬成員的實現可在派生類使用關鍵字override來重寫;或使用關鍵字new來覆蓋。htm

注意: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:  }
相關文章
相關標籤/搜索