国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

深入解析C#中的abstract抽象類

2020-01-24 01:18:39
字體:
來源:轉載
供稿:網友

抽象類和類成員
通過在類定義前面放置關鍵字 abstract,可以將類聲明為抽象類。例如:

public abstract class A{  // Class members here.}

抽象類不能實例化。抽象類的用途是提供一個可供多個派生類共享的通用基類定義。例如,類庫可以定義一個抽象類,將其用作多個類庫函數的參數,并要求使用該庫的程序員通過創建派生類來提供自己的類實現。
抽象類也可以定義抽象方法。方法是將關鍵字 abstract 添加到方法的返回類型的前面。例如:

public abstract class A{  public abstract void DoWork(int i);}

抽象方法沒有實現,所以方法定義后面是分號,而不是常規的方法塊。抽象類的派生類必須實現所有抽象方法。當抽象類從基類繼承虛方法時,抽象類可以使用抽象方法重寫該虛方法。例如:

// compile with: /target:librarypublic class D{  public virtual void DoWork(int i)  {    // Original implementation.  }}public abstract class E : D{  public abstract override void DoWork(int i);}public class F : E{  public override void DoWork(int i)  {    // New implementation.  }}

如果將 virtual 方法聲明為 abstract,則該方法對于從抽象類繼承的所有類而言仍然是虛方法。繼承一個抽象方法的類不能訪問該方法的原始實現。在上一個示例中,類 F 中的 DoWork 不能調用類 D 中的 DoWork。通過這種方式,抽象類可以強制派生類為虛方法提供新的方法實現。

定義抽象屬性

下面的示例演示如何定義抽象屬性。抽象屬性聲明不提供屬性訪問器的實現,它只聲明該類支持屬性,而將訪問器實現留給派生類。下面的示例演示如何實現從基類繼承的抽象屬性。
此示例由三個文件組成,其中每個文件都單獨編譯,產生的程序集由下一次編譯引用:

  • abstractshape.cs:包含抽象 Area 屬性的 Shape 類。
  • shapes.cs:Shape 類的子類。
  • shapetest.cs:測試程序,它顯示某些 Shape 派生對象的面積。

若要編譯該示例,請使用以下命令:

csc abstractshape.cs shapes.cs shapetest.cs

這樣將生成可執行文件 shapetest.exe。
該文件聲明的 Shape 類包含 double 類型的 Area 屬性。

// compile with: csc /target:library abstractshape.cspublic abstract class Shape{  private string name;  public Shape(string s)  {    // calling the set accessor of the Id property.    Id = s;  }  public string Id  {    get    {      return name;    }    set    {      name = value;    }  }  // Area is a read-only property - only a get accessor is needed:  public abstract double Area  {    get;  }  public override string ToString()  {    return Id + " Area = " + string.Format("{0:F2}", Area);  }}

屬性的修飾符就放置在屬性聲明中。例如:

public abstract double Area

聲明抽象屬性時(如本示例中的 Area),指明哪些屬性訪問器可用即可,不要實現它們。在此示例中,只有一個 get 訪問器可用,因此該屬性是只讀的。
下面的代碼演示 Shape 的三個子類,并演示它們如何重寫 Area 屬性來提供自己的實現。

// compile with: csc /target:library /reference:abstractshape.dll shapes.cspublic class Square : Shape{  private int side;  public Square(int side, string id)    : base(id)  {    this.side = side;  }  public override double Area  {    get    {      // Given the side, return the area of a square:      return side * side;    }  }}public class Circle : Shape{  private int radius;  public Circle(int radius, string id)    : base(id)  {    this.radius = radius;  }  public override double Area  {    get    {      // Given the radius, return the area of a circle:      return radius * radius * System.Math.PI;    }  }}public class Rectangle : Shape{  private int width;  private int height;  public Rectangle(int width, int height, string id)    : base(id)  {    this.width = width;    this.height = height;  }  public override double Area  {    get    {      // Given the width and height, return the area of a rectangle:      return width * height;    }  }}

下面的代碼演示一個測試程序,它創建若干 Shape 派生對象,并輸出它們的面積。

// compile with: csc /reference:abstractshape.dll;shapes.dll shapetest.csclass TestClass{  static void Main()  {    Shape[] shapes =    {      new Square(5, "Square #1"),      new Circle(3, "Circle #1"),      new Rectangle( 4, 5, "Rectangle #1")    };    System.Console.WriteLine("Shapes Collection");    foreach (Shape s in shapes)    {      System.Console.WriteLine(s);    }  }}

輸出:

  Shapes Collection  Square #1 Area = 25.00  Circle #1 Area = 28.27  Rectangle #1 Area = 20.00

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁武县| 松桃| 通辽市| 特克斯县| 扶沟县| 西华县| 南宁市| 吴旗县| 垫江县| 河北区| 如东县| 普洱| 星座| 钟祥市| 阳东县| 和静县| 苗栗市| 乾安县| 上栗县| 张北县| 绥阳县| 永城市| 新巴尔虎左旗| 柳江县| 阆中市| 文水县| 炎陵县| 轮台县| 长武县| 四子王旗| 屯门区| 延边| 洪泽县| 嘉义市| 吉木乃县| 鄢陵县| 普定县| 吴川市| 亚东县| 定西市| 曲松县|