C#OOP之七 多態的學習和使用

      網友投稿 769 2025-04-01

      視頻:https://edu.csdn.net/course/detail/27107


      多態

      什么是多態,看看大辭典的:可以呈現不同形式的能力或狀態。這一術語來源于生物系統,意指同族生物具有的相同特征。而在.Net中,多態指同一操作作用于不同的實例,產生不同運行結果的機制。

      多態可以分為靜態多態和動態,即編譯時多態和運行時多態。靜態多態比如,漢語中有“打”這個字,但是與不同的字組合,則形成了不同的單詞組合,來代表不同的含義,如打飯、打架、打車、打卡等,這種方式是在實現已經定義好了的意思,不管誰打飯、誰打架都代表一樣的意思,類似于編譯器首先將同名稱的代碼定義好了,編程中的具體實現是重載;

      靜態多態:即編譯器就確定類、方法的關聯關系,一般以方法重載來實現。如我們熟悉的計算器為例:

      /*功能:實現計算器;將計算功能和用戶輸入分離

      時間:08/09/09?星期二?第二節

      版本:6.1.1

      //構成方法重載的前提是;方法名一致,參數個數不同、參數類型不一致、參數順序不一樣

      */

      usingSystem;

      class Calc

      {

      private double result; //再增加一個結果變量

      public double Jia(double num1,doublenum2) //加法運算:形參:num1,num2

      {

      result=num1+num2+100;

      return result;

      }

      public int Jia(int num1,int num2)

      {

      result=num1+num2+200;

      return (int)result;

      }

      publicdouble Jian(double num1,double num2) //減法運算

      {

      result=num1-num2;

      return result;

      }

      public int Jian(int num1,int num2) //減法運算

      {

      result=num1-num2;

      return (int)result;

      }

      public double Cheng(double num1,double num2) //乘法運算

      {

      result=num1*num2;

      return result;

      }

      public double Chu(double num1,doublenum2) //除法運算

      {

      result=num1/num2;

      return result;

      }

      public double PingFang(double num1)

      {

      result=num1*num1;

      return result;

      }

      public double NciFang(double num1,doublenum2) //num1:2的num2:5次方

      {

      result=1; //定義result為1

      for(int i=1;i<=num2;i++)

      {

      result=result*num1;

      }

      return result;

      }

      }

      /**********客戶端類,即界面類***********/

      classClacGUI

      {

      static void Main()

      {

      Calc jisuanqi; //jisuanqi=?

      jisuanqi=new Calc();

      int x,y; //x,y為Main()的局部變量

      Console.Write("請輸入第一個數字:");

      x=Convert.ToInt32(Console.ReadLine());

      Console.Write("請輸入第二個數字:");

      y=Convert.ToInt32(Console.ReadLine());

      char op; //op為Main()的局部變量,表示操作符

      Console.Write("請輸入您要進行的運算:+ - * / ^:"); //^:表示求N次方

      op=Convert.ToChar(Console.ReadLine());

      switch(op)

      {

      case '+': //加運算

      Console.WriteLine(jisuanqi.Jia(x,y));

      break;

      case '-':

      Console.WriteLine(jisuanqi.Jian(x,y));

      break;

      case '*': //加運算

      Console.WriteLine(jisuanqi.Cheng(x,y));

      break;

      case '/':

      if(y==0)

      Console.WriteLine("除數不能為0");

      else

      Console.WriteLine(jisuanqi.Chu(x,y));

      break;

      case '^':

      Console.WriteLine(jisuanqi.NciFang(x,y));

      break;

      default:

      Console.WriteLine("其他無效選擇!!!");

      break;

      }

      }

      }

      動態多態:也叫動態綁定(后期綁定),是在運行時通過虛方法、重寫機制來實現。在.Net中虛方法以virtual關鍵字來標記。再來復習下virtual和override。

      virtual關鍵字用于修飾方法、屬性、索引器或事件聲明,并使它們可以在派生類中被重寫。例如,此方法可被任何繼承它的類重寫。

      默認情況下,方法是非虛擬的。不能重寫非虛方法。

      在該示例中,Dimensions類包含x、y兩個坐標和Area()虛方法。不同的形狀類,如Circle、Cylinder和Sphere繼承Dimensions類,并為每個圖形計算表面積。每個派生類都有各自的Area()重寫實現。根據與此方法關聯的對象,通過調用適當的Area()實現,程序為每個圖形計算并顯示適當的面積。

      在前面的示例中,注意繼承的類 Circle、Sphere和Cylinder都使用了初始化基類的構造函數,

      using System;

      class TestClass

      {

      publicclass Dimensions

      {

      public const double PI = Math.PI;

      protecteddouble x, y;

      public Dimensions()

      {

      }

      public Dimensions(double x, double y)

      {

      this.x = x;

      this.y = y;

      }

      public virtual double Area()

      {

      return x * y;

      }

      }

      public class Circle : Dimensions

      {

      public Circle(double r) : base(r, 0)

      {

      }

      public override double Area()

      {

      return PI * x * x;

      }

      }

      C#OOP之七 多態的學習和使用

      classSphere : Dimensions

      {

      public Sphere(double r) : base(r, 0)

      {

      }

      public override double Area()

      {

      return 4 * PI * x * x;

      }

      }

      classCylinder : Dimensions

      {

      public Cylinder(double r, double h) : base(r, h)

      {

      }

      public override double Area()

      {

      return 2 * PI * x * x + 2 * PI * x * y;

      }

      }

      staticvoid Main()

      {

      double r = 3.0, h = 5.0;

      Dimensions c = new Circle(r);

      Dimensions s = new Sphere(r);

      Dimensions l = new Cylinder(r, h);

      // Displayresults:

      Console.WriteLine("Area of Circle = {0:F2}", c.Area());

      Console.WriteLine("Area of Sphere = {0:F2}", s.Area());

      Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());

      }

      }

      效果如下:

      Area ofCircle?? = 28.27

      Area ofSphere?? = 113.10

      Area ofCylinder = 150.80

      虛方法和抽象方法的區別如下:

      動態多態程序案例如下:

      using System;

      public class DrawingObject

      {

      public virtual void Draw()

      {

      Console.WriteLine("畫形狀的基類");

      }

      }

      public class Line :DrawingObject

      {

      public override void Draw()

      {

      Console.WriteLine("畫一條線");

      }

      }

      public class Circle : DrawingObject

      {

      public override void Draw()

      {

      Console.WriteLine("畫一個圓");

      }

      }

      public class Square : DrawingObject

      {

      public override void Draw()

      {

      Console.WriteLine("畫一個正方形");

      }

      }

      public classDrawDemo

      {

      public static int Main(string[] args)

      {

      DrawingObject[] dObj = new DrawingObject[4];

      dObj[0] = new Line();

      dObj[1] = new Circle();

      dObj[2] = new Square();

      dObj[3] = new DrawingObject();

      foreach (DrawingObject drawObj in dObj)

      {

      drawObj.Draw();

      }

      return 0;

      }

      }

      輸出結果是:

      畫一條線

      畫一個圓

      畫一個正方形

      畫形狀的基類

      /*代碼分析:

      在DrawDemo類中的Main()方法中,創建了一個數組,數組元素是DrawingObject 類的對象。該數組名為dObj,是由四個DrawingObject類型的對象組成。

      接下來, 初始化dObj數組, 由于Line, Circle和Square類都是DrawingObject類的派生類,所以這些類可以作為dObj數組元素的類型。 如果C#沒有這種功能,你得為每個類創建一個數組。繼承的性質可以讓派生對象當作基類成員一樣用,這樣就節省了編程工作量。

      一旦數組初始化之后,接著是執行foreach循環,尋找數組中的每個元素。在每次循環中, dObj 數組的每個元素(對象)調用其Draw()方法。多態性體現在:在運行時,各自調用每個對象的Draw()方法。盡管dObj 數組中的引用對象類型是DrawingObject,這并不影響派生類重載DrawingObject 類的虛方法Draw()。 在dObj 數組中,通過指向DrawingObject 基類的指針來調用派生類中的重載的Draw()方法。

      */

      實踐問題:

      1.??? 關于實現多態下面哪個選項是不正確的?()

      A.你可以通過實現接口來實現多態???? C.你可以通過繼承實現多態

      C.你可以通過封裝實現多態??????????????? D.你可以通過使用抽象類實現多態

      2.下面哪個是函數重載的例子?()

      A.? void example();??????????????????? B.? voidexample1();

      char example();??????????????????????? void example2();

      C.??? void example1(int,int);??????????? D.? voidexample1(int,int);

      void example2(char,char);????????????? void example1(char,char);

      3.下列哪個不屬于函數簽名:()

      A.參數類型???? B.參數順序??????? C.參數數量?????? D.參數名稱

      4.考慮下面的語句:

      A.在動態多態中,程序的適當方法可以被調用,依賴于上下文。

      B.在前期綁定中,函數在運行時被綁定。

      5關于這些語句下面哪個選項是正確的?()

      A.語句A為真,語句B為假????? B. 語句A為假,語句B為真

      C.兩個語句A和B都是真??????? D. 兩個語句A和B都是假

      小結:

      在本章中,我們主要學習了:

      u??????多態是什么

      u??????多態的分類和使用

      u??????多態的好處

      英語詞匯:

      英文????????????全文????????????????????????????????????????中文

      Hour?????????????????????????????????????????????????????? 小時

      Maximum?????? ????????????????????????????????? ????????? ?????? 最大值

      Minimum???????????????????????????????????????????????? 最小值

      Argument??????????????????????????????????????????????? 參數

      Location?????????????????????????????????????????? 定位

      Chapter??????????????????????????????????????????? 章、節

      Application????????????????????????????????????????????? 應用

      Activity???????????????????????????????????????????? 活動

      Debug???????????????????????????????????????????????????? 調試

      Compare???????????????????????????????????????????????? 比較

      Distance?????????????????????????????????????????? 區別、不同

      Operator???????????????????????????????????????????????? 操作

      Struct????????????????????????????????????????????????????? 結構

      Binary???????????????????????????????????????????????????? 二進制

      練習項目:

      現在公司讓要開發一款程序,用來一鍵式打開常見的計算機資料,例如文檔、圖片和影音文件等,只需安裝一個程序就可以免了其他文件的管理,并且使用方便。簡單分析如下了改萬能加載器的功能點,考慮如下幾點:

      n???自動加載各種資料,一站式搜索系統常見資料;

      n???能夠打開常見文檔類資料,例如txt文件、word文件、pdf文件、Visio文件

      n???能夠打開常見圖片資料,例如jpg格式文件、gif文件、png文件

      n???能夠打開常見音頻資料和視頻資料,例如avi文件、mp3文件

      支持簡單可用的類型擴展接口,易于實現更多文件類型的加載

      C# 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:生產成本制造費用管理費用(生產成本制造費用管理費用屬于什么科目)
      下一篇:手機表格app設計(手機端表格設計)
      相關文章
      亚洲免费视频在线观看| 国产亚洲精品a在线无码| 亚洲色欲色欲综合网站| 亚洲国产美女精品久久久久∴| 自拍偷自拍亚洲精品播放| 亚洲成人免费在线观看| 久久精品亚洲精品国产色婷| 亚洲va在线va天堂va不卡下载| 久久精品7亚洲午夜a| 亚洲国产精品一区二区久久hs| 国产日产亚洲系列| 国产aⅴ无码专区亚洲av麻豆 | 亚洲色图校园春色| 亚洲精品一区二区三区四区乱码| 亚洲综合久久久久久中文字幕| 亚洲日韩乱码中文无码蜜桃臀| 亚洲人成影院在线高清| 亚洲综合久久一本伊伊区| 亚洲一区二区三区乱码在线欧洲| 亚洲国产最大av| 亚洲区日韩精品中文字幕| 亚洲欧美第一成人网站7777| 亚洲AV噜噜一区二区三区 | 蜜臀亚洲AV无码精品国产午夜.| 色噜噜的亚洲男人的天堂| 亚洲成a人片在线观看国产| 久久久久亚洲精品男人的天堂 | 亚洲一区二区三区免费观看| 亚洲三级高清免费| 亚洲av日韩aⅴ无码色老头| 亚洲一级特黄无码片| 亚洲乱码日产一区三区| 亚洲资源在线观看| 亚洲国产成人无码av在线播放| 亚洲AV男人的天堂在线观看| 亚洲hairy多毛pics大全| 亚洲午夜精品一级在线播放放| 亚洲色无码一区二区三区| 亚洲好看的理论片电影| 亚洲午夜久久久精品电影院| 亚洲女女女同性video|