1. 程式人生 > >【C#基礎】面向物件

【C#基礎】面向物件

一、為什麼需要面向物件:

  在面向物件出現之前,結構化程式設計是程式設計的主流,被稱為”面向過程“的程式設計。

    面向過程的開發方法,通常會存在以下問題:

      1、軟體複用性差

      2、軟體可維護性差

      3、軟體靈活性差

  面向物件程式設計思想中的物件,是一種具有狀態(屬性)和行為(方法)的資料結構,用於描述現實世界的某個事物,將現實世界的事物模型化。

二、物件與類的關係:

  類:對事物的一種抽象定義;

  物件:客觀存在的具體事物。

  2.1、建立類和物件:

    宣告類:class className    //<類名>

        {

          //Fields<欄位> 儲存資料

                                    //Properties<屬性> 保護欄位,對欄位的取值和設值進行限定,屬性的本質就是兩個方法

          //Methods<方法> 描述物件的行為

                                    //建構函式          初始化物件(給物件的屬性依次賦值)

            //類中的成員,如果不加訪問修飾符,預設為Private

        }

    建立物件:className Object=new Constructor(引數列表);

            類名   物件名             構造方法()

              類是不佔記憶體的,而物件是佔記憶體的。在物件被建立時,會自動呼叫建構函式初始化物件;

  2.2、欄位與屬性:

    1、欄位:類的成員,用於描述一類事物的某個特徵的變數。

      【舉例】:Employee類中具有很多的特徵(如姓名、年齡等),在定義類時即可用兩個欄位分別儲存員工的姓名和年齡。

        class Employee  //宣告類

        {

          public String employeeName;//員工的姓名欄位

          public int emlioyeeAge;//員工的年齡欄位

        }

        Employee employee=new Employee();//建立物件(例項化物件相當於實實在在存在的一個人,類只是抽象的定義一個人的類)

        employee.employeeAge=20;//通過物件使用欄位,給物件賦值年齡。

    2、屬性:對欄位的封裝,用於阻止非法資料的輸入,從而保護內部資料的安全。

      【封裝】:隱藏內部實現、對外提供公共操作的方式。

           物件就是封裝了資料和操作這些資料的程式碼的邏輯實體。

           在一個物件內部,某些程式碼和資料不能被外界訪問,物件通過這種方式對內部資料提供不同級別的保護,用於防止程式中的隱藏部分由於意外而被改變或被錯誤操作。

      【訪問修飾符】:從上到下,私有程度逐漸降低

        private:只能在本類中使用
        protected:本類中及其子類中可以使用
        internal:同一名稱空間(程式集)中的類可以使用
        public:所有類均可使用

      【舉例】:Employee類中具有很多的特徵(如姓名、年齡等),在定義類時即可用兩個欄位分別儲存員工的姓名和年齡。

       

      public enum Gender
    {
        man,
        woman
    }
    class Employee//宣告員工類
    {
        private String employeeName;//員工的姓名欄位
        public String EmployeeName

        {
            get { return employeeName; }
            set { employeeName = value; }
        }

        private Gender gender;
        public Gender Gender
        {
            get
            {
                //在Get方法裡對非法值進行限定
                if (gender != Gender.man && gender != Gender.woman)
                {
                    gender = Gender.man;
                }
                return gender;
            }
            set { gender = value; }
        }

        private int employeeAge;//員工的年齡欄位
        public int EmployeeAge
        {
            get { return employeeAge; }
            set
            {
                //在Set方法裡對非法值進行限定
                if (value <= 0 || value > 100)
                {
                    employeeAge = 18;
                    Console.WriteLine("年齡設定錯誤!");
                }
                else
                {
                    employeeAge = value;
                }
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public Employee(string name, Gender gender, int age)
        {
            this.EmployeeName = employeeName;
            //在建構函式裡對非法值進行限定
            if (gender != Gender.man && gender != Gender.woman)
            {
                gender = Gender.man;
            }
            this.Gender = gender;
            this.EmployeeAge = employeeAge;

        }
    }

        Employee employee=new Employee();//建立物件(例項化物件相當於實實在在存在的一個人,類只是抽象的定義一個人的類)

        employee.employeeAge=20;//設值,自動呼叫屬性EmployeeAge中的set訪問器        

        Console.WriteLine("該員工的年齡是:{0}",employee.EmployeeAge);//取值,自動呼叫屬性EmployeeAge中的get訪問器

 

  2.3、方法:(例項方法)面向物件程式設計中,物件可以執行的操作被稱為方法。

    1、方法的定義和呼叫:

      【語法】:訪問修飾符  返回值型別  方法名(引數列表)  

           {                    

            方法體;                

           }                         

                    【注意】引數列表可以為空,但括號不能省略;存在多個引數時,需要使用逗號分隔。

                      返回值型別可以是c#中的任意型別;也可以沒有返回值,若沒有返回值則必須使用Void.

                      方法體中無論有多少行程式碼都必須使用括號將其括起來。

      【呼叫】:

        a、同一類中的方法直接通過方法名進行呼叫;

        b、同一名稱空間不同類中的方法呼叫方式如下:

            ⑴、建立物件;//類名   物件名=new  構造方法();

            ⑵、通過物件名.方法名進行呼叫。//物件名.方法名();

        c、不同名稱空間中的方法呼叫方式如下:

            ⑴、匯入名稱空間;//using 名稱空間

            ⑵、建立物件;

            ⑶、通過物件名.方法名進行呼叫。

    2、構造方法:類被例項化時首先執行的一種特殊方法,用於完成物件屬性的初始化操作。(在建立物件的同時將屬性初始化)

        【注意】:一個類中若沒有定義任何構造方法,則執行環境會提供一個無參的構造方法。

        【分為】:無參的構造方法和有參的構造方法。

                               //建構函式,函式名與類名相同

                               //建構函式沒有返回值,連Void都不用

        【語法】:訪問類名(引數列表)  

             {          

               語句塊;

             }

        【舉例】:class Employee

             {

                 public Employee(String employeeName,int employeeAge)//建立一個有參的建構函式

               {

                  EmployeeName=employeeName;

                  EmployeeAge=employeeAge;

               }

             }

             //建立物件

             Employee employee=new Employee("Jack",20);

    3、靜態方法:(類方法)通過satic關鍵字修飾的方法

      【語法】:訪問修飾符  static  返回值型別  方法名(引數列表)  

           {                        

              方法體;

           }

                 靜態和非靜態的區別
                   1)、在非靜態類中,既可以有例項成員,也可以有靜態成員。  
                   2)、在呼叫例項成員的時候,需要使用物件名.例項成員;
                    在呼叫靜態成員的時候,需要使用類名.靜態成員名;
        總結:靜態成員必須使用類名去呼叫,而例項成員使用物件名呼叫。
                  靜態函式中,只能訪問靜態成員,不允許訪問例項成員。
                  例項函式中,既可以使用靜態成員,也可以使用例項成員。
                  靜態類中只允許有靜態成員,不允許出現例項成員。