91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中多態性學習/虛方法/抽象方法和接口怎么使用

發布時間:2023-03-28 11:44:06 來源:億速云 閱讀:116 作者:iii 欄目:開發技術

這篇文章主要介紹了C#中多態性學習/虛方法/抽象方法和接口怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C#中多態性學習/虛方法/抽象方法和接口怎么使用文章都會有所收獲,下面我們一起來看看吧。

1. 多態性定義

C#中的多態性是OOP(面向對象編程)的一個基本概念,它允許一個對象在不同情況下表現出不同的行為,以增強代碼的可重用性和靈活性。

根據網上的教程,我們得知C#多態性分為兩類,靜態和動態。但實際上,C#沒有嚴格的靜態和動態多態性的分法。之所以這么分,還是為了我們便于理解,我們沿用這個思維來大概分類:

采用函數重載或運算符重載方法的,屬于靜態多態性;

采用虛方法、抽象方法、接口等方式,屬于動態多態性。

拓展:

在靜態多態性中,函數的響應是在編譯時發生的。在動態多態性中,函數的響應是在運行時發生的。什么意思呢?

在靜態語言中,許多多態性的特性可以在編譯時確定,編譯器可以根據數據類型的信息來確定方法的調用方式。

而在動態語言中,數據類型的確定通常是在運行時進行的,這種行為被稱為動態多態性。

2. 函數重載示例

函數重載是指在同一個類中,定義多個方法,它們的方法名相同,但是參數類型、參數數量、參數順序不同。以下是一個函數重載的例子:

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    public int Add(int a, int b, int c)
    {
        return a + b + c;
    }
    public float Add(float a, float b)
    {
        return a + b;
    }
    public double Add(double a, double b)
    {
        return a + b;
    }
}

在這個例子中,Calculator類定義了4個Add()方法,它們的方法名相同但是參數列表不同(分別有2個整型參數、3個整型參數、2個浮點型參數、2個雙精度浮點型參數)。這些方法根據聲明的參數類型和數量而得到不同的簽名,因此構成函數重載,當調用Add()方法時,編譯器會根據參數的類型和數量來選擇正確的方法重載進行調用。

3. 虛方法示例

虛方法和重寫(override)方法:在父類中聲明一個虛方法,子類可以重寫該方法并實現自己的行為。在運行時,程序根據對象的實際類型調用相應的方法。這種方式也稱為“消除靜態綁定”。

注意事項:虛方法是使用關鍵字 virtual 聲明的。同時繼承類中的重寫虛函數需要聲明關鍵字 override 。下面是一個示例:

// 定義一個Animal類和其子類
class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("I am an animal.");
    }
}

class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Woof!");
    }
}

class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Meow!");
    }
}

// 示例程序
class Program
{
    static void Main(string[] args)
    {
        Animal[] animals = new Animal[2];
        animals[0] = new Dog();
        animals[1] = new Cat();

        foreach (Animal animal in animals)
        {
            animal.Speak();
        }

        Console.ReadKey();
    }
}

在這個例子中,Animal類中聲明了一個虛方法Speak(),它的子類 Dog 和 Cat 分別對該方法進行了重寫。在Main 方法中,創建了一個 Animal 數組,其中存放了 Dog 和 Cat 的實例。在foreach循環中,程序根據實際對象類型調用了不同的Speak()方法,實現了多態性的效果。

小拓展:關鍵字重寫 override 與覆蓋 new 較為容易搞混,有關兩者區別可移步:C#中重寫(override)及覆蓋(new)的區別詳解。

4. 抽象方法示例

抽象方法是在抽象類中定義的,它沒有具體實現的代碼,而只是定義了方法的名稱、參數和返回值類型等信息。抽象方法必須在子類中進行完整的實現,否則子類本身也必須定義為抽象類。使用abstract關鍵字來定義抽象類和抽象方法。

下面的示例演示了如何定義并使用抽象方法:

abstract class Shape 
{
  public abstract double Area(); // 定義抽象方法Area()
}
// 派生類Rectangle繼承抽象類Shape
class Rectangle : Shape  
{
  double width, height;

  public Rectangle(double w, double h) 
  {
    width = w;
    height = h;
  }
  
  public override double Area() // 實現抽象方法Area()
  {
    return width * height;
  }
}

class Triangle : Shape  
{
  double baseValue, height;

  public Triangle(double bv, double h) 
  {
    baseValue = bv;
    height = h;
  }
  
  public override double Area() // 實現抽象方法Area()
  {
    return baseValue * height * 0.5;
  }
}

class Program 
{
  static void Main(string[] args) 
  {
    Rectangle r = new Rectangle(5, 8);
    Console.WriteLine("矩形的面積 = {0}", r.Area());

    Triangle t = new Triangle(5, 8);
    Console.WriteLine("三角形的面積 = {0}", t.Area());
  }
}

上面的代碼定義了Shape類和兩個派生類Rectangle和Triangle。Shape類中定義了一個抽象方法Area(),并在Rectangle和Triangle中實現了這個抽象方法。在Main方法中,創建了一個Rectangle對象 r 和一個Triangle對象 t,并分別調用它們的Area()方法計算出它們的面積。

5. 接口示例

C#接口是一種約定,是一個抽象的類型,它定義了一組公共的方法、屬性、索引器和事件,這些成員沒有實現細節和實現代碼,只定義了接口的行為。

5.1 接口語法

定義接口的語法如下:

interface 接口名稱
{
  方法1
  方法2
  屬性1
  索引器1
  事件1
}

其中,方法、屬性、索引器和事件都是接口的成員,它們都沒有實現,只是定義了行為的名稱和參數。

方法定義的語法如下:返回類型 方法名稱(參數列表);

屬性定義的語法如下:屬性類型 屬性名稱 { get; set; }

索引器定義的語法如下:索引器類型 this[索引器參數] { get; set; }

事件定義的語法如下:event 事件委托類型 事件名稱;

其中,事件委托類型是一個Delegate類型。

5.2 接口使用示例

定義一個接口之后,可以通過繼承或實現來使用接口。接口的繼承使用“:”符號,需要注意的是,如果一個類實現了一個接口,那么它必須實現接口中所有的方法和屬性。下面是接口示例:

interface IShape
{
  double Perimeter();
  double Area();
}

interface ICircle : IShape
{
  double Radius { get; set; }
}

interface IRectangle : IShape
{
  double Width { get; set; }
  double Height { get; set; }
}

class Circle : ICircle
{
  public double Radius { get; set; }

  public double Perimeter()
  {
    return 2 * Math.PI * Radius;
  }

  public double Area()
  {
    return Math.PI * Radius * Radius;
  }
}

class Rectangle : IRectangle
{
  public double Width { get; set; }
  public double Height { get; set; }

  public double Perimeter()
  {
    return 2 * (Width + Height);
  }

  public double Area()
  {
    return Width * Height;
  }
}

class Program
{
  static void Main(string[] args)
  {
    Circle c = new Circle();
    c.Radius = 1;
    Console.WriteLine("Circle:  Perimeter = {0}, Area = {1}", c.Perimeter(), c.Area());

    Rectangle r = new Rectangle();
    r.Width = 2;
    r.Height = 3;
    Console.WriteLine("Rectangle:  Perimeter = {0}, Area = {1}", r.Perimeter(), r.Area());
  }
}

上面的代碼定義了IShape、ICircle和IRectangle三個接口、以及Circle和Rectangle兩個類。其中,Circle類實現了ICircle接口,Rectangle類實現了IRectangle接口。在Main方法中,創建了一個Circle對象和一個Rectangle對象,并給它們的屬性賦值。然后分別調用了Circle和Rectangle對象的Perimeter()和Area()方法輸出結果。

運行程序,輸出以下結果:

Circle:  Perimeter = 6.28318530717959, Area = 3.14159265358979
Rectangle:  Perimeter = 10, Area = 6

可以看到,通過使用接口,我們可以很方便地定義出不同的形狀,然后計算出它們的周長和面積。這就展示了接口在C#編程中的重要地位。

關于“C#中多態性學習/虛方法/抽象方法和接口怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C#中多態性學習/虛方法/抽象方法和接口怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武胜县| 嘉祥县| 临清市| 安西县| 鄂托克前旗| 留坝县| 朝阳县| 马边| 上杭县| 吴桥县| 武隆县| 太仓市| 腾冲县| 将乐县| 建水县| 怀集县| 吉林省| 惠水县| 大姚县| 遂溪县| 潞西市| 阜南县| 共和县| 西乡县| 镇宁| 胶州市| 塔河县| 庆安县| 惠州市| 郑州市| 平定县| 团风县| 方正县| 炎陵县| 杭锦旗| 甘洛县| 文成县| 镇雄县| 巨鹿县| 绩溪县| 英德市|