面向對象三大特性之繼承

来源:http://www.cnblogs.com/gaofei-1/archive/2017/02/22/6429915.html
-Advertisement-
Play Games

什麼是繼承? 繼承是將兩個類中相同的屬性及方法抽取出來,放到一個新的類中(父類),而這兩個子類依然擁有這些屬性和方法。抽象點的 說,每輛車子都能跑(擁有跑的方法),都有輪胎(有輪胎這個屬性)。 使用繼承編程的好處? 使用繼承編程可以大大的減少代碼冗餘,增加代碼復用。 如何使用繼承? 以第一問為例做延 ...


什麼是繼承?

    繼承是將兩個類中相同的屬性及方法抽取出來,放到一個新的類中(父類),而這兩個子類依然擁有這些屬性和方法。抽象點的

    說,每輛車子都能跑(擁有跑的方法),都有輪胎(有輪胎這個屬性)。

 

使用繼承編程的好處?

    使用繼承編程可以大大的減少代碼冗餘,增加代碼復用。

 

如何使用繼承?

    以第一問為例做延伸:假若我們現在需要兩個類,一個貨車類,一個轎車類。代碼如下

/// <summary>
 2     /// 貨車類
 3     /// </summary>
 4     class Truck
 5     {
 6         //時速
 7         public int Speed { get; set; }
 8         //顏色
 9         public string Colour { get; set; }
10         //購買價格
11         public double Price { get; set; }
12         
13         /// <summary>
14         /// 貨運方法
15         /// </summary>
16         public void Cargo()
17         {
18             Console.WriteLine("運輸貨物");
19         }
20     }
21 
22     /// <summary>
23     /// 轎車類
24     /// </summary>
25     class Sedan
26     {
27         //時速
28         public int Speed { get; set; }
29         //顏色
30         public string Colour { get; set; }
31         //購買價格
32         public double Price { get; set; }
33         
34         /// <summary>
35         /// 載客方法
36         /// </summary>
37         public void CarryPassengers()
38         {
39             Console.WriteLine("載客");
40         }
41     }
示例 : 未使用繼承

 

    通過這段代碼不難發現,貨車類和轎車類擁有三個相同的屬性,一個不同的方法。根據繼承的特性,需要把相同的屬性或方法抽

    取出來。代碼如下

/// <summary>
 2     /// 車輛類 父類
 3     /// </summary>
 4     class Vehicle
 5     {
 6         //時速
 7         public int Speed { get; set; }
 8         //顏色
 9         public string Colour { get; set; }
10         //購買價格
11         public double Price { get; set; }
12     }
13 
14     /// <summary>
15     /// 貨車類 繼承車輛類
16     /// </summary>
17     class Truck : Vehicle
18     {
19         /// <summary>
20         /// 貨運方法
21         /// </summary>
22         public void Cargo()
23         {
24             Console.WriteLine("運輸貨物");
25         }
26     }
27 
28     /// <summary>
29     /// 轎車類 繼承車輛類
30     /// </summary>
31     class Sedan : Vehicle
32     {
33         /// <summary>
34         /// 載客方法
35         /// </summary>
36         public void CarryPassengers()
37         {
38             Console.WriteLine("載客");
39         }
40     }
示例 : 使用繼承

     

    那麼問題又來了,繼承的特性-代碼復用體現在哪裡呢?下麵我們簡單地瞭解一下。

    在第一段代碼中,有兩個類,如果我們想在創建對象時使用帶參構造函數來初始化屬性的話,要在兩個類中都寫上相同的一段代

    碼。(構造函數詳解)

 1     /// <summary>
 2     /// 貨車類
 3     /// </summary>
 4     class Truck
 5     {
 6         //時速
 7         public int Speed { get; set; }
 8         //顏色
 9         public string Colour { get; set; }
10         //購買價格
11         public double Price { get; set; }
12         public Truck(int speed, string colour, double price)
13         {
14             this.Speed = speed;
15             this.Colour = colour;
16             this.Price = price;
17         }
18         ...
19     }
20 
21     /// <summary>
22     /// 轎車類
23     /// </summary>
24     class Sedan
25     {
26         //時速
27         public int Speed { get; set; }
28         //顏色
29         public string Colour { get; set; }
30         //購買價格
31         public double Price { get; set; }
32         public Truck(int speed, string colour, double price)
33         {
34             ...
35         }
36         ...
37     }
示例 : 冗餘的代碼

 

    顯而易見,上面的重覆代碼很多。下麵我們使用繼承來簡化一下上面的代碼。

 1     /// <summary>
 2     /// 車輛類 父類
 3     /// </summary>
 4     class Vehicle
 5     {
 6         //時速
 7         public int Speed { get; set; }
 8         //顏色
 9         public string Colour { get; set; }
10         //購買價格
11         public double Price { get; set; }
12 
13         /// <summary>
14         /// 帶參構造函數
15         /// </summary>
16         /// <param name="speed"></param>
17         /// <param name="colour"></param>
18         /// <param name="price"></param>
19         public Vehicle(int speed, string colour, double price)
20         {
21             this.Speed = speed;
22             this.Colour = colour;
23             this.Price = price;
24         }
25     }
26 
27     /// <summary>
28     /// 貨車類 繼承車輛類
29     /// </summary>
30     class Truck : Vehicle
31     {
32         /// <summary>
33         /// 子類使用父類構造函數
34         /// </summary>
35         public Truck(int speed, string colour, double price) :
36             base (speed,colour,price)
37         {
38 
39         }
40         ...
41     }
42 
43     /// <summary>
44     /// 轎車類 繼承車輛類
45     /// </summary>
46     class Sedan : Vehicle
47     {
48         /// <summary>
49         /// 子類使用父類構造函數
50         /// </summary>
51         public Sedan(int speed, string colour, double price) :
52             base (speed,colour,price)
53         {
54 
55         }
56         ...
57     }
示例 : 簡化的代碼

 

    使用了繼承之後,即使再多的派生類需要帶參構造函數,也不怕了,只要一行代碼即可完成。

    Base關鍵字:

      base關鍵字表示父類,可以用於訪問父類的成員。例:base.父類成員。

 

      除了上面通過base顯示的調用父類帶參構造函數外,創建子類對象時還會隱式的調用父類的無參構造函數。(創建子類對象時

    會先調用父類的無參構造函數。)

 

進一步瞭解和使用繼承

    繼承的特性:

        1.傳遞性:繼承可以無限的向下派生,但是需要符合一個條件:子類可以出現在父類出現的地方並替換父類,即子類

           擁有父類的全部特征和能夠實現父類的全部方法。

        2.單根性:一個子類只能繼承自一個父類。不存在一個子類同時繼承自兩個或多個父類的情況。

    is a關鍵字:

        這個關鍵字用來判斷對象是否屬於給定的類型。返回值為bool類型。

        例:

            if (Vehicle is Truck)

            {
                ...
            }

    sealed關鍵字:

        用這個關鍵字修飾的類是不能被繼承的,即密封類。常用的string類就是密封類。本文只做瞭解,後更示例。

 

至此,關於繼承已經講得差不多了,下麵是本文用到的所有代碼,希望可以幫到看到此處的你。

  1     class Program
  2     {
  3         static void Main(string[] args)
  4         {
  5             Demo demo = new Demo();
  6             demo.Test();
  7 
  8             Console.Read();
  9         }
 10     }
 11 
 12     class Demo
 13     {
 14         List<Vehicle> vehicles = new List<Vehicle>();
 15         
 16         public void Test()
 17         {
 18             vehicles.Add(new Truck(50, "藍色", 150000));
 19             vehicles.Add(new Sedan(80, "黑色", 210000));
 20             foreach (Vehicle item in vehicles)
 21             {
 22                 if (item is Truck)
 23                 {
 24                     Console.WriteLine("我是貨車,時速{0},我是{1}的,價格{2}元。", item.Speed, item.Colour, item.Price);
 25                     ((Truck)item).Cargo();
 26                 }
 27                 if (item is Sedan)
 28                 {
 29                     Console.WriteLine("我是轎車,時速{0},我是{1}的,價格{2}元。",item.Speed,item.Colour,item.Price);
 30                     ((Sedan)item).CarryPassengers();
 31                 }
 32             }
 33         }
 34     }
 35 
 36     /// <summary>
 37     /// 車輛類 父類
 38     /// </summary>
 39     class Vehicle
 40     {
 41         //時速
 42         public int Speed { get; set; }
 43         //顏色
 44         public string Colour { get; set; }
 45         //購買價格
 46         public double Price { get; set; }
 47 
 48         /// <summary>
 49         /// 帶參構造函數
 50         /// </summary>
 51         /// <param name="speed"></param>
 52         /// <param name="colour"></param>
 53         /// <param name="price"></param>
 54         public Vehicle(int speed, string colour, double price)
 55         {
 56             this.Speed = speed;
 57             this.Colour = colour;
 58             this.Price = price;
 59         }
 60     }
 61 
 62     /// <summary>
 63     /// 貨車類 繼承車輛類
 64     /// </summary>
 65     class Truck : Vehicle
 66     {
 67         /// <summary>
 68         /// 子類使用父類構造函數
 69         /// </summary>
 70         public Truck(int speed, string colour, double price) :
 71             base (speed,colour,price)
 72         {
 73 
 74         }
 75 
 76         /// <summary>
 77         /// 貨運方法
 78         /// </summary>
 79         public void Cargo()
 80         {
 81             Console.WriteLine("我能運輸貨物");
 82         }
 83     }
 84 
 85     /// <summary>
 86     /// 轎車類 繼承車輛類
 87     /// </summary>
 88     class Sedan : Vehicle
 89     {
 90         /// <summary>
 91         /// 子類使用父類構造函數
 92         /// </summary>
 93         public Sedan(int speed, string colour, double price) :
 94             base (speed,colour,price)
 95         {
 96 
 97         }
 98         /// <summary>
 99         /// 載客方法
100         /// </summary>
101         public void CarryPassengers()
102         {
103             Console.WriteLine("我可以載客");
104         }
105     }
完整代碼

 

    

 

 

 

 結尾語:學到知識不與人分享,猶如衣錦夜行,毫無意義。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我最近幾天正在學習Entity Framework Code First.我打算分享一系列的學習筆記,今天是第一部分: 為什麼要使用Code First: 近年來,隨著domain driven design的推廣,以前那種先建好資料庫,然後再編寫代碼的方式受到了越來越多的質疑。因為使用這種開發方式 ...
  • WCF的服務需要寄宿在進程中,我們把服務端的叫做宿主,為服務指定宿主指定的過程叫服務寄宿。有兩種方式一種是自我寄宿(Self-Hosting),一種是IIS寄宿方式。Self-Hosting我們通過一個控制台應用作為服務的宿主,IIS我們將服務寄宿於IIS工作進程。客戶端通過另一個控制台應用模擬(進 ...
  • 0 Asp.Net Core 項目實戰之許可權管理系統(0) 無中生有 1 Asp.Net Core 項目實戰之許可權管理系統(1) 使用AdminLTE搭建前端 2 Asp.Net Core 項目實戰之許可權管理系統(2) 功能及實體設計 3 Asp.Net Core 項目實戰之許可權管理系統(3) 通過 ...
  • lambda In的用法: lambda表達式查詢沒有IN這個方法,可以變通一下,in查詢的數組是否包含在映射對象裡面的集合里: 如下代碼: SQL:select * from db where DepartmentID in(departmentIDs) lambda groupby的用法 計算各 ...
  • 一、控制反轉(IoC) ASP.NET Core在啟動以及後續針對每個請求的處理過程中的各個環節都需要相應的組件提供相應的服務,為了方便對這些組件進行定製,ASP.NET通過定義介面的方式對它們進行了“標準化”,我們將這些標準化的組件稱為服務,ASP.NET在內部專門維護了一個DI容器來提供所需的服 ...
  • 在上一篇博文WebAPI用法中說了一下Web API在MVC4中使用的樣例。但有些時候我們只是想使用Web API的功能,而不需要使用整個的MVC,這個時候就該拋開MVC4來新建項目了。 首先要新建一個asp.net空應用程式,在程式中添加引用System.Web.Http和System.Web.H ...
  • 《C#語言和資料庫技術基礎》第一章1..NET Framework 框架2.sharp 尖銳3.application 應用程式4.developer 開發者5.network 網路6.build 建造,建築7.console 控制台8.debug 調試9.namespace 命名空間10.proj ...
  • 在《通過擴展讓ASP.NET Web API支持W3C的CORS規範》中我們通過自定義的HttpMessageHandler為ASP.NET Web API賦予了跨域資源共用的能力,具體來講,這個自定義的CorsMessageHandler的自由主要體現在如下兩個方面:其一,為簡單跨域請求的響應和繼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...