欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年01月29日 15:10:36   投稿:goldensun  
這篇文章主要介紹了深入解析C#中的abstract抽象類,包括定義抽象類等C#面相對象編程中的基礎知識,需要的朋友可以參考下

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

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

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

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

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

// compile with: /target:library
public 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

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

// compile with: csc /target:library abstractshape.cs
public 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.cs
public 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;
    }
  }
}

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

// compile with: csc /reference:abstractshape.dll;shapes.dll shapetest.cs
class 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

相關文章

  • Unity使用LineRender實現簽名效果

    Unity使用LineRender實現簽名效果

    這篇文章主要為大家詳細介紹了Unity使用LineRender實現簽名效果,制作簽名功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • WPF調用WindowsAPI實現屏幕錄制

    WPF調用WindowsAPI實現屏幕錄制

    這篇文章主要為大家詳細介紹了WPF如何調用WindowsAPI實現屏幕錄制,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-05-05
  • C# Winform 讓整個窗口都可以拖動

    C# Winform 讓整個窗口都可以拖動

    Windows 的 API 果然強大啊.以前要實現全窗口拖動, 要寫鼠標按下和抬起事件, 很是麻煩, 偶爾還會出現 BUG
    2011-05-05
  • C#單例模式(Singleton Pattern)實例教程

    C#單例模式(Singleton Pattern)實例教程

    這篇文章主要介紹了C#單例模式(Singleton Pattern)的實現方法,主要講述了即時加載的單例模式、延遲加載的單例模式與線程安全的單例模式,需要的朋友可以參考下
    2014-09-09
  • 淺談c# WPF中的PreviewTextInput

    淺談c# WPF中的PreviewTextInput

    這篇文章主要介紹了淺談c# WPF中PreviewTextInput的相關資料,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C# OpenCvSharp利用白平衡技術實現圖像修復功能

    C# OpenCvSharp利用白平衡技術實現圖像修復功能

    這篇文章主要為大家詳細介紹了C# OpenCvSharp如何利用白平衡技術實現圖像修復功能,文中的示例代碼講解詳細,希望對大家有一定的幫助
    2024-02-02
  • C#如何提取經緯度文件中的經緯度數據

    C#如何提取經緯度文件中的經緯度數據

    近期開發(fā)時需要獲取當前的經緯度坐標,下面這篇文章主要給大家介紹了關于C#如何提取經緯度文件中經緯度數據的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 使用Barrier來控制線程同步示例

    使用Barrier來控制線程同步示例

    這篇文章主要介紹了使用Barrier來控制線程同步示例,需要的朋友可以參考下
    2014-04-04
  • C#導入導出Excel數據的兩種方法

    C#導入導出Excel數據的兩種方法

    這篇文章主要為大家詳細介紹了C#導入導出Excel數據的兩種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • C#如何獲取文件全路徑、目錄、擴展名、文件名稱

    C#如何獲取文件全路徑、目錄、擴展名、文件名稱

    這篇文章主要介紹了C#如何獲取文件全路徑、目錄、擴展名、文件名稱問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論