最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C#中多態(tài)性學(xué)習(xí)/虛方法/抽象方法和接口的用法

 更新時(shí)間:2023年03月28日 10:43:36   作者:letmebaby  
這篇文章主要為大家詳細(xì)介紹了C#中多態(tài)性學(xué)習(xí)、虛方法、抽象方法和接口的用法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

1. 多態(tài)性定義

C#中的多態(tài)性是OOP(面向?qū)ο缶幊蹋┑囊粋€(gè)基本概念,它允許一個(gè)對(duì)象在不同情況下表現(xiàn)出不同的行為,以增強(qiáng)代碼的可重用性和靈活性。

根據(jù)網(wǎng)上的教程,我們得知C#多態(tài)性分為兩類,靜態(tài)和動(dòng)態(tài)。但實(shí)際上,C#沒有嚴(yán)格的靜態(tài)和動(dòng)態(tài)多態(tài)性的分法。之所以這么分,還是為了我們便于理解,我們沿用這個(gè)思維來大概分類:

采用函數(shù)重載或運(yùn)算符重載方法的,屬于靜態(tài)多態(tài)性;

采用虛方法、抽象方法、接口等方式,屬于動(dòng)態(tài)多態(tài)性。

拓展:

在靜態(tài)多態(tài)性中,函數(shù)的響應(yīng)是在編譯時(shí)發(fā)生的。在動(dòng)態(tài)多態(tài)性中,函數(shù)的響應(yīng)是在運(yùn)行時(shí)發(fā)生的。什么意思呢?

在靜態(tài)語(yǔ)言中,許多多態(tài)性的特性可以在編譯時(shí)確定,編譯器可以根據(jù)數(shù)據(jù)類型的信息來確定方法的調(diào)用方式。

而在動(dòng)態(tài)語(yǔ)言中,數(shù)據(jù)類型的確定通常是在運(yùn)行時(shí)進(jìn)行的,這種行為被稱為動(dòng)態(tài)多態(tài)性。

2. 函數(shù)重載示例

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

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;
    }
}

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

3. 虛方法示例

虛方法和重寫(override)方法:在父類中聲明一個(gè)虛方法,子類可以重寫該方法并實(shí)現(xiàn)自己的行為。在運(yùn)行時(shí),程序根據(jù)對(duì)象的實(shí)際類型調(diào)用相應(yīng)的方法。這種方式也稱為“消除靜態(tài)綁定”。

注意事項(xiàng):虛方法是使用關(guān)鍵字 virtual 聲明的。同時(shí)繼承類中的重寫虛函數(shù)需要聲明關(guān)鍵字 override 。下面是一個(gè)示例:

// 定義一個(gè)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();
    }
}

在這個(gè)例子中,Animal類中聲明了一個(gè)虛方法Speak(),它的子類 Dog 和 Cat 分別對(duì)該方法進(jìn)行了重寫。在Main 方法中,創(chuàng)建了一個(gè) Animal 數(shù)組,其中存放了 Dog 和 Cat 的實(shí)例。在foreach循環(huán)中,程序根據(jù)實(shí)際對(duì)象類型調(diào)用了不同的Speak()方法,實(shí)現(xiàn)了多態(tài)性的效果。

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

4. 抽象方法示例

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

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

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() // 實(shí)現(xiàn)抽象方法Area()
  {
    return width * height;
  }
}

class Triangle : Shape  
{
  double baseValue, height;

  public Triangle(double bv, double h) 
  {
    baseValue = bv;
    height = h;
  }
  
  public override double Area() // 實(shí)現(xiàn)抽象方法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類和兩個(gè)派生類Rectangle和Triangle。Shape類中定義了一個(gè)抽象方法Area(),并在Rectangle和Triangle中實(shí)現(xiàn)了這個(gè)抽象方法。在Main方法中,創(chuàng)建了一個(gè)Rectangle對(duì)象 r 和一個(gè)Triangle對(duì)象 t,并分別調(diào)用它們的Area()方法計(jì)算出它們的面積。

5. 接口示例

C#接口是一種約定,是一個(gè)抽象的類型,它定義了一組公共的方法、屬性、索引器和事件,這些成員沒有實(shí)現(xiàn)細(xì)節(jié)和實(shí)現(xiàn)代碼,只定義了接口的行為。

5.1 接口語(yǔ)法

定義接口的語(yǔ)法如下:

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

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

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

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

索引器定義的語(yǔ)法如下:索引器類型 this[索引器參數(shù)] { get; set; }

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

其中,事件委托類型是一個(gè)Delegate類型。

5.2 接口使用示例

定義一個(gè)接口之后,可以通過繼承或?qū)崿F(xiàn)來使用接口。接口的繼承使用“:”符號(hào),需要注意的是,如果一個(gè)類實(shí)現(xiàn)了一個(gè)接口,那么它必須實(shí)現(xiàn)接口中所有的方法和屬性。下面是接口示例:

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三個(gè)接口、以及Circle和Rectangle兩個(gè)類。其中,Circle類實(shí)現(xiàn)了ICircle接口,Rectangle類實(shí)現(xiàn)了IRectangle接口。在Main方法中,創(chuàng)建了一個(gè)Circle對(duì)象和一個(gè)Rectangle對(duì)象,并給它們的屬性賦值。然后分別調(diào)用了Circle和Rectangle對(duì)象的Perimeter()和Area()方法輸出結(jié)果。

運(yùn)行程序,輸出以下結(jié)果:

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

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

想必大家看到這里對(duì)于多態(tài)性的實(shí)現(xiàn)方式已經(jīng)有了一定的了解,不知大家是否發(fā)現(xiàn),這些方式中,抽象方法和虛方法是如此的相似,那么我們就有了新的疑問:兩者有何區(qū)別?使用場(chǎng)景是否有所不同?

在下面這篇隨筆中,我針對(duì)這個(gè)問題進(jìn)行了深入學(xué)習(xí):C#中抽象方法與虛方法的區(qū)別。

以上就是詳解C#中多態(tài)性學(xué)習(xí)/虛方法/抽象方法和接口的用法的詳細(xì)內(nèi)容,更多關(guān)于C# 多態(tài)性 虛方法 抽象方法 接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何給C#變量取名字

    如何給C#變量取名字

    本文主要介紹了如何給C#變量取名字,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C#中Abstract方法和Virtual方法的區(qū)別

    C#中Abstract方法和Virtual方法的區(qū)別

    這篇文章介紹了C#中Abstract方法和Virtual方法的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Unity實(shí)現(xiàn)繞任意軸任意角度旋轉(zhuǎn)向量

    Unity實(shí)現(xiàn)繞任意軸任意角度旋轉(zhuǎn)向量

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)繞任意軸任意角度旋轉(zhuǎn)向量,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C#使用Gembox.SpreadSheet向Excel寫入數(shù)據(jù)及圖表的實(shí)例

    C#使用Gembox.SpreadSheet向Excel寫入數(shù)據(jù)及圖表的實(shí)例

    下面小編就為大家分享一篇C#使用Gembox.SpreadSheet向Excel寫入數(shù)據(jù)及圖表的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C#操作SQLite數(shù)據(jù)庫(kù)方法小結(jié)

    C#操作SQLite數(shù)據(jù)庫(kù)方法小結(jié)

    這篇文章介紹了C#操作SQLite數(shù)據(jù)庫(kù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Unity游戲開發(fā)之炸彈人游戲的實(shí)現(xiàn)

    Unity游戲開發(fā)之炸彈人游戲的實(shí)現(xiàn)

    大家小時(shí)候肯定玩過這款游戲,炸彈人也算是經(jīng)典中的經(jīng)典啦。本文將利用Unity模擬實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-03-03
  • Quartz.Net任務(wù)和觸發(fā)器實(shí)現(xiàn)方法詳解

    Quartz.Net任務(wù)和觸發(fā)器實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Quartz.Net任務(wù)和觸發(fā)器實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • C# 禁止應(yīng)用程序多次啟動(dòng)的實(shí)例

    C# 禁止應(yīng)用程序多次啟動(dòng)的實(shí)例

    經(jīng)常我們會(huì)有這樣的需求,只讓應(yīng)用程序運(yùn)行一個(gè)實(shí)體,下面是實(shí)現(xiàn)的方法,有需要的朋友可以參考一下
    2013-09-09
  • c#多線程之線程基礎(chǔ)

    c#多線程之線程基礎(chǔ)

    本文詳細(xì)講解了c#多線程之線程基礎(chǔ),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#如何通過RFC連接sap系統(tǒng)

    C#如何通過RFC連接sap系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#如何通過RFC連接sap系統(tǒng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評(píng)論

广河县| 淮滨县| 中卫市| 咸丰县| 大同县| 三门峡市| 甘洛县| 炎陵县| 响水县| 上蔡县| 乐平市| 璧山县| 镇原县| 阿克苏市| 萍乡市| 甘孜| 调兵山市| 巫山县| 云梦县| 宁都县| 庆云县| 兖州市| 临沂市| 湖南省| 唐海县| 双辽市| 稷山县| 同仁县| 兴化市| 肥东县| 绥中县| 巍山| 万盛区| 将乐县| 石台县| 普陀区| 平谷区| 武隆县| 防城港市| 青田县| 莱芜市|