C# Class

      在〈C# Class〉中尚無留言

自訂資料結構

不同於基本資料型態, 若想創造自行定義的資料結構, 就需使用struct. 比如要儲存一個學生的資料, 裏面有姓名, 數學成績, 英文成績, 如下程式碼

struct Student{
        char * name;
        int math;
        int eng;
};

在c語言中, 沒有class這個觀念, 所以只能用malloc取得struct的空間
Student s=malloc(sizeof(Student));
經由malloc函數向系統要求一塊記憶體空間, 空間Size為上述Student的結構 12byte, 並將最頂端的位址傳回給s

而在C++裏, 就開始有new 這個關鍵字指令了, 可以使用如下方式取代malloc
Student s=new Student();
new 只是語法比較精簡而以

Class

由struct進行改良, 加入了方法, 繼承, 抽象類別, 介面, 形成了現今的物件導向理論 

物件類別變數

    class Pokemon
    {
        private int level;//物件變數
        public double w, h;//物件變數
        public static int count;//類別變數
        public void setLevel(int level)
        {
            if (level > 10) this.level = level;
            else this.level = level ;
        }
        public int getLevel()
        {
            return level;
        }
    }

上述的level, w, h, 是寫在 class xxx{ } 這個 “{ }” 之中的, 所以稱為物件或類別變數, 又統稱field variable. 而前面有加 static的變數(紅色), 稱為類別變數, 沒加 static(監色), 稱為物件變數

當產生一個物件時, 如Pokemon p=new Pokemon();, 可以使用 p.w or p.h 來存取裏面的值. 致於物件變數的話, 請注意, 在 C# 不可以使用 p.count來存取, 而是需要使用 Pokemon.count來存取.

權限–封裝

上面的 w, h 變數, 前面加上了public(公用的), 所以可以於Main() 中 直接使用. 但level變數宣告為 private(私用的), 只能在 class Pokemon{} 這個類別中使用, 一離開這個 class, 就完全禁止操作.

此時就必需於 class Pokemon 類別中再使用 public void setLevel() 及 public int getLevel() 這二個方法, 才能存取level.

我們把這種寫法稱為封裝, 又稱為軟体IC.

方法

上述程式碼中的 getLevel()及setLevel(), 在C語言中稱為函數. 但在物件導向中, 這二個函數是存於類別中, 且前面沒有加 static, 則稱為物件方法.

同樣的, 如果方法前面有加static的話, 就稱為類別方法.

 建構子 Constractor

1. New 出物件時, 會自動執行的特殊方法
2. 建構子名稱與類別名稱一模一樣
3. 建構子就是一個方法, 但沒有傳回值, 連void也沒有
4. 若沒有預設建構子, 系統會自動加入預設建構子
5. 若有自訂建構子, 系統不會自動加入預設建構子
6. 建構子重載時, 可於建構子後面加上 :this(xxx) 調用其他重載建構子

class Pokemon
    {
        public double w, h;
        private int level;
        public Pokemon(int level)
        {
            this.level = level;
            Console.WriteLine("神奇寶貝出生了");
            Console.WriteLine("level={0}", this.level);
        }
        public Pokemon() : this(1)
        {
        }
    }

方法重載 OverLoading

下面的監色代碼, 二個方法名稱都是 setLevel(), 但裏面的參數不一樣, 這稱為方法重載.  在Main()中如果使用 p.setLevel(), 則等級設定為1, 若使用 p.setLevel(5), 則會跑下面的方法將等級設為5.

    class Pokemon
    {
        private int level;//物件變數
        public double w, h;//物件變數
        public static int count;//類別變數
        public void setLevel()
        {
            this.level = 1;
        }
        public void setLevel(int level)
        {
            if (level > 10) this.level = level;
            else this.level = level ;
        }
    }

在使用方法重載時, 有一個名詞需注意, 叫簽名(Signature)

簽名 : 方法名 + 參數型態 + 參數個數

當簽名不一樣時, 才可以作方法重載. 假設有一個方法是
public void setLevel(int x, int y){}, 則如下的方法中有的是正確,  有的是錯誤的, 請仔細比對

public void setLevel(int x, int y){}
public void setLevel(int a, int b){} //error, 參數型態一樣
public void setLevel(int x){} //ok, 參數數量不一樣, 故簽名不同
public void setLevel(float x, int y){} //ok, 參數型態不一樣
public int setLevel(int x, int y){} //error, 簽名不包含傳回值型態
private void setLevel(int x, int y){} //error, 簽名不包含權限

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *