面向對象(二)——三大特性(封裝、繼承、多態)

来源:http://www.cnblogs.com/H2921306656/archive/2016/08/22/5794359.html
-Advertisement-
Play Games

一、封裝 目的:保護類,讓類更加安全。 做法:讓類裡面的成員變數變為私有(即訪問修飾符)的,做相應的方法或者屬性去間接的操作成員變數 ※訪問修飾符 private 私有的 只能在該類中訪問 protected 受保護的 只能在該類和它的子類中訪問 public 公有的 在任何地方都可以訪問 △封裝成 ...


一、封裝

目的保護類,讓類更加安全。

做法讓類裡面的成員變數變為私有(即訪問修飾符)的,做相應的方法或者屬性去間接的操作成員變數

※訪問修飾符

private 私有的              只能在該類中訪問

protected 受保護的       只能在該類和它的子類中訪問

public 公有的                在任何地方都可以訪問

 

封裝成員方法來間接操作類裡面的成員變數

例:

 

class Ren
    {
        private string name;
        private int age;  //年齡必須在18-50之間
        //取age的值
        public int GetAge()
        {
            return age;
        }
        //給age賦值
        public void SetAge(int a)
        {
            if (age >= 18 && age <= 50)
            {
                age = a;
            }
            else
            {
                age = 18;
            }
        }
        //取name的值
        public string GetName()
        {
            return name;
        }
        //給name賦值
        public void SetName(string n)
        {
            name = n;
        }
    }
View Code

 

static void Main(string[] args)
        {
            Ren r = new Ren();
            r.SetAge(8);
            r.SetName("張三"); //將’張三‘賦值給成員name
            Console.WriteLine(r.GetAge+r.GetName);
            Console.ReadLine();
        }
View Code

△使用成員屬性來間接訪問類裡面的成員變數

  定義變數的時候最好用_下劃線開頭

  選中要做的成員變數右鍵→重構→封裝欄位(ctrl+r,e)

      自動生成的代碼不是成員變數也不是成員方法  是成員屬性

      造好之後可以通過成員屬性操作成員變數

例:

class Student
    {
        private string _Name;
        public string Name
        {
            get { return _Name; }//簡化的方法
            set { _Name = value; }
        }
        private int _Age;
        public int Age 
        {
            get { return _Age; }
            set 
            {
                if (value >= 18 && value <= 50)
                {
                    _Age = value;
                }
                else
                {
                    _Age = 18;
                }
            }
        }

        private string _Sex;
        public string Sex {get;set;}//簡寫 缺點:不能控制值,不能用於構造函數
    }
View Code  
static void Main(string[] args)
        {
            Student s = new Student();
            s.Name="趙四";
            s.Sex="";
            s.Age=19;
            Console.WriteLine(s.Sex+s.Name+s.Age);
            Console.ReadLine();
        }
View Code

構造方法(函數):

作用造對象所要調用的方法,用來創建對象

      每一個類都有一個構造方法,不寫也有隻不過看不到而已

特殊性寫法特殊 (方法名=類名;沒有返回值)

      執行時間特殊(創建對象時執行)

用途可以對成員進行初始化

舉個例子:

class Student
    {
        public Student(string s,string n)
        {
            _Sex = s;
            _Name = n;
        }
    }
View Code

 

static void Main(string[] args)
        {
           Student s = new Student("","張三");//new Student()就是調用了一個方法

            Console.WriteLine(s.Sex+s.Name);
            Console.ReadLine();
        }
View Code

舉個慄子使用面向對象來求兩個圓之間的面積

class Program
    {
        static void Main(string[] args)
        {
            Yuan y1 = new Yuan();
            y1.R = 10;
            Yuan y2 = new Yuan();
            y2.R = 5;

            double cha = y1.mianji() - y2.mianji();
            Console.WriteLine(cha);
            Console.ReadLine();
        }
    }
    class Yuan
    {
        private int r;

        public int R
        {
            get { return r; }
            set { r = value; }
        }
        public double mianji()
        {
            return r * r * 3.14;
        }
        public double zhouchang()
        {
            return 2 * r * 3.14;
        }
    }
View Code

函數重載

函數重載需要的條件函數名要相同,參數的個數或者參數的類型不同

this關鍵字:

雖然寫在類裡面,但不是屬於類的,而是屬於該對象的

一般來說在類裡面 this關鍵字是可以省略的,但是如果有一個方法形參名字和成員名字重覆,這時候再調用該對象裡面的成員的時候需要加this關鍵字

is關鍵字: 判斷變數是不是屬於某個類型

例:if (y2 is Ren)   

    {     

                 s = "是一個人";   

    }   

    else   

    {     

                s = "不是一個人";   

    }

as關鍵字: 轉換類型(只能轉換相容類型,可以將子類對象轉換為父類對象

二、繼承

子類可以繼承父類的一切

特點單繼承   一個子類只能有一個父類  一個父類可以有多個子類

C#特殊點:所有類的祖先都是object

base關鍵字:在子類中代表父類對象,用法和this關鍵字相同         

                   如果父類有構造方法,那麼子類也要有構造方法,如果父類構造需要參數,那麼子類構造也必須有相應的參數。         

                   子類構造後面可以通過base調用父類的構造方法         

                   public China(string m):base(m) {}

class Program
    {
        static void Main(string[] args)
        {
            China c = new China("zs");
            Console.WriteLine(c.Eat());
            Console.ReadLine();
        }
    }

    class Ren
    {
        private string _Name;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
        private int _Age;

        public int Age
        {
            get { return _Age; }
            set { _Age = value; }
        }
        //父類的構造方法
        public Ren(string n)
        {
            _Name = n;
        }

        public string Speak()
        {
            return _Name+"人類正在講話";
        }

    }

    class China:Ren
    {
        public China(string m):base(m)
        {
            
        }
        public string Eat()
        {
            return base.Name+"用筷子吃飯";
            //return base.Speak();
        }
    }
    class America : Ren
    {
        public America(string m): base(m)
        {
            
        }
        public string Eat()
        {
            return "用刀叉吃飯";
        }
    }
View Code

sealed關鍵字

密封類 該類不可以被繼承

sealed class 類名

{

}

部分類:partial

可以將一個類拆分成多個部分,分別放在多個文件內

調用需要namespace相同,或用use引用

namespace 命名空間 相當於虛擬文件夾

partial class 類名   //拆分的類均加partial

{

}

三、多態

1.編譯多態

函數重載

2.運行多態

概念當父類引用指向子類實例的時候,由於子類對父類的方法進行了重寫,在調用該方法的時候表現出的不同就稱為多態

條件必須要有繼承  父類引用指向子類實例  子類必須對父類的方法進重寫

里氏代換原則如果有一個地方需要使用到父類對象,那麼你可以將一個子類對象給他

class Program
    {
        static void Main(string[] args)
        {
         DongWu dw = new Dog();            
       Dog d = new Dog();
            Console.WriteLine(Ceshi(dw));
            Console.WriteLine(CeShi(d));
            Console.ReadLine();
        }

        public static string CeShi(DongWu d)
        {
            return "ok";
        }
    }

    class DongWu
    {
        public virtual string Eat() //虛方法
        {
            return "該動物在吃飯";
        }
    }
    class Dog:DongWu
    {
        public override string Eat() //重寫
        {
            return "狗正在吃骨頭";
        }
    }
    class Cat : DongWu
    {
        public override string Eat()
        {
            return "貓正在吃魚";
        }
    }
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 來源:http://www.bjsxt.com/ 一、【GOF23設計模式】_單例模式、應用場景、餓漢式、懶漢式 1、GOF23設計模式 2、單例模式 3、餓漢式 4、懶漢式 二、【GOF23設計模式】_單例模式、雙重檢查鎖式、靜態內部類式、枚舉式、UML類圖 雙重檢測鎖實現 靜態內部類實現 枚舉實 ...
  • 本文介紹了Java中的四種I/O模型,同步阻塞,同步非阻塞,多路復用,非同步阻塞。同時將NIO和BIO進行了對比,並詳細分析了基於NIO的Reactor模式,包括經典單線程模型以及多線程模式和多Reactor模式。 ...
  • 在Hibernate中有一種查詢語句是Criteria查詢(QBC查詢),今天呢 我們就一個個的詳細的跟大家一起探討Criteria語句的相關知識點 案例前的準備 案例一:查詢所有學生信息(Criteria) 經過以上語句我們可以看到的查詢結果如下: 案例二:查詢男生的信息(帶條件查詢)(Restr ...
  • 本文為原創文章,轉載請註明出處,謝謝 負載均衡 1、原理 服務端啟動創建臨時節點(下圖中servers下節點),臨時節點數據包含負載信息 客戶端啟動獲取伺服器列表,並根據負載去連接一個負載較輕的伺服器 服務端每次接收到客戶端的連接,添加自己的負載,客戶端斷開與自己的連接則減少自己的負載 2、架構圖 ...
  • 回到目錄 關於webapi我之前寫了一些文章,大家可以根據目錄去瀏覽,今天要說的是個怪問題,也是被我忽略的一個問題,當你的Url參數需要被Api自動解析成實體的屬性,實事上是要有條件的,不是所以屬性都可以被自動賦值的,下麵我們就來看看先決條件: 條件一:類屬性名稱必須和參數名稱相同 條件二:API參 ...
  • 一、設計模式 1、工廠模式 public class JiSuan { private int a; public int A { get { return a; } set { a = value; } } private int b; public int B { get { return b; ...
  • 一、類庫 引用別人寫的類 1、源代碼方法: 可以將直接寫好的.cs源代碼文件,添加進我的解決方案文件夾下,在解決方案資源管理器中, 項目上右鍵→添加→現有項,來添加此.cs源代碼文件的使用,需要引入相應的命名空間 2、類庫方法: 一個dll文件,就是一個類庫 它人新建一個類庫,在裡面編寫類和相應的方 ...
  • 靜態 1.普通成員 普通成員都是屬於對象的 用對象調用 2.靜態成員 靜態成員是屬於類的 用類名調用 stactic 靜態關鍵字 註:靜態方法裡面不能包含普通成員 普通方法裡面可以包含靜態成員 用處:1.為了簡便,連接資料庫的時候,造連接對象類,使用靜態屬性直接返回連接對象。 2.兩個類之間傳遞信息 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...