一、封裝 1、定義 每個對象都包含它進行操作所需要的所有信息,這個特性稱為封裝。因此對象不必以來其他對象來完成自己的操作。這樣方法和類包裝在類中,通過類的實例來實現。 2、好處 良好的封裝能夠減少耦合; 類內部實現就可以自由地修改; 類具有清晰的接口; 3、實例 [csharp] <span style="font-size:18px;">class Cat { private string name=""; public Cat(string name) { this name=name; } public string Shout() { return "我的名字叫"+name+"小貓"; } }</span> 二、繼承 1、定義 繼承就是從父類中獲取一些公開的成員,如方法和屬性。C#中只允許繼承一個父類,但允許繼承多個接口。如果子類繼承接口,則必須實現接口中定義的所有公開成員。 公開成員是指在父類中定義為public的成員(public的作用域可在子類中生效,而private作用域則不可) 子類繼承父類: 子類擁有父類非Private的屬性和功能; 子類具有自己的屬性和功能,即子類可以擴展父類沒有的屬性和功能; 子類還可以以自己的方式實現父類的功能(方法重寫) 2、優點 繼承使得所有子類公共部分都放在父類中,使得代碼得到共享,這就避免了重復。此外,繼承可使得修改或擴展繼承而來的實現都較為容易。 3、實例 [csharp] <span style="font-size:18px;">例1: //父類 ParentClass classParentClass { privatestring_name; //屬性 public stringParentName //父類名 { get{return _name;} set{_name=value;} } }</span> <span style="font-size:18px;">//子類 //父類SonClass class SonClass:ParentClass { privatestring_name; //屬性 public stringSonName //子類名 { get{return _name;} set{_name=value;} } } //客戶端 SonClass myson=new SonClass(); //創建子類對象 myson.ParentName="父名"; //自動繼承父類的屬性 myson.SonName="子名"; //子類自己的屬性 例2: private void button1_Click(object sender,EventArgs e) { Cat cat = new Cat("咪咪");//將類實例化 Cat cat聲明一個Cat對象,對象名為cat;newCat()將此cat對象實例化 cat.ShoutNum = 5; //給屬性賦值 MessageBox.Show(cat.Shout()); } class Animal //定義父類 { protected string name =""; //注意變為Protected 子類可以繼承 public Animal(string name) { this.name = name; } public Animal() { this.name = "無名"; } protected int shoutNum = 3; //變為protected public int ShoutNum { get { return shoutNum; } set { shoutNum = value; } } } class Cat : Animal //注意變化 { public Cat() : base() //子類構造方法需要調用父類同樣參數類型的構造方法,用base關鍵字代表父類 { } public Cat(string name):base(name) //注意變化 { } public string Shout() { string result = ""; for (int i = 0; i <shoutNum; i++) result += "喵!"; return "我的名字叫:" +name + "" + result; } } class Dog : Animal //注意變化 { public Dog() : base() { } public Dog(string name): base(name) { } public string shout() { string result = ""; for (int i = 0; i <shoutNum; i++) result += "汪!"; return "我的名字叫:" +name + "" + result; } } private void button2_Click(objectsender, EventArgs e) { Dog dog = new Dog("狗");//將類實例化 Cat cat聲明一個Cat對象,對象名為cat;newCat()將此cat對象實例化 dog.ShoutNum = 5; //給屬性賦值 MessageBox.Show(dog.shout()); } </span> 4、注意 Protected表示繼承時子類可以對基類有完全訪問權。也就是說protected修飾的類成員,對子類公開,段不對其他類公開。 三、多態 1、定義 多態是指類可以有多種形態,通過修改可以形成多個實現方法。子類從父類繼承時它會獲得父類的所有方法、字段、屬性、事件。多態表示不同的對象可以執行相同的操作,但要通過它們自己的實現代碼來執行。 若要改變父類的數據和行為,兩種方式:可創建新的成員替換父級成員,或者可以重寫虛擬的父級成員。 (1)若要替換父級成員,需要使用new關鍵字。下面是GetName方法的兩種形態,一種是返回父級名稱,一種是返回子級名稱。 [csharp] <span style="font-size:18px;">第一種:返回父級名稱 class PerentClass //父類 { public string GetName() { return"父級名稱"; } } 第二種:返回子級名稱 class SonClass:PerentClass //子類繼承父類 { public new string GetName() { return"子級名稱"; } } (2)重寫虛擬的父級成員的兩個條件:父級成員使用關鍵字“virtual”;子級成員使用“override”。代碼 class PerentClass //父類 { public virtual string GetName() { return"父級名稱"; } } class SonClass:PerentClass //子類繼承父類 { public override string GetName() { return"子級名稱"; } }</span> 2、注意 子類以父類省份出現 子類在工作中以自己的方式來實現 子類乙父類的身份出現時,子類特有的屬性和方法不可同時使用 使用多態時,需了解:虛方法和方法重寫 為了使子類的實例完全接替來自父類的成員,父類必須將該成員聲明為虛擬的。這是通過在該成員的返回類型之前添加virtual來實現。 子類選擇使用override關鍵字,將父類實現替換為自己的實現,這就是方法重寫。 3、實例 (1)創建類"Employee"表示公司裡的員工。它包含虛方法GetDepart。代碼: [csharp] class Employee //父類 { public virtual string GetDepart() { return"總公司"; } } (2)創建類"MarketEmployee",它重寫了父類中的GetDepart方法。代碼 [csharp] class MarketEmployee:Employee //子類繼承父類 { public override string GetDepart() { return"市場部"; } } (3)客戶端調用兩種形態的方法。 [csharp] www.2cto.com Employee myee=new Employee(); //創建父類 string str1=myee.GetDepart(); //結果為父公司 MarketEmployee yee=newMarketEmployee(); //創建子類 string str2=yee.GetDepart(); //結果為子公司