(變數私人的叫欄位,公有的是屬性)
對象是一個自包含的實體,用一組可識別的特性和行為來識別
類:具有相同的屬性和功能的對象的抽象的集合
(類名字首字母要大寫,如果是多個單詞則各個單詞首字母都要大寫)
構造方法/建構函式,就是對類進行初始化。構造方法與類同名,無傳回值,
也不需要void,在new時候調用
(所有類都有構造方法,如果不編碼則系統預設產生空的構造方法,
若你有定義的構造方法,那麼預設的構造方法就會失效了)
方法重載提供了建立同民的多個方法的能力,但是這些方法需使用不同的參數類型。
(方法名相同,但參數類型或個數有所不同)
protected 表示繼承時,子類可以對基類有完全訪問權。子類繼承父類,則子類就擁有了父類的
除private外的屬性和功能。(對子類公開,但不對其他類公開)
protected 只給繼承的子類使用。調用父類的成員,可以用base關鍵字A7.繼承的優點是,繼承使得所有子類公用的部分都放在了父類,使得代碼得到了共用,這樣避免了重複,另外,繼承可使得修改或擴充繼承而來的實現都較為容易
不繼承的話,如果要修改功能,就必須在所有重複的方法中修改,代碼越多,出錯的可能就越大。
繼承是有缺點的,父類變,則子類不得不變。繼承會增大兩個類之間的耦合性。
(is-a 一個類是另一個類的特殊種類時,可以考慮用繼承;has-a 某個角色具有某一項責任時,不適合用繼承,如飛機場有飛機則飛機不能繼承飛機場)A8.多態表示不同的對象可以執行相同的動作,但要通過它們自己的實現代碼來執行。
1.子類以父類的身份出現。2.子類工作時以自己的方式來實現。3.子類以父類的身份出現時,子類特有的屬性和方法不可以使用。
為了使子類的執行個體完全接替來自父類的類成員,父類必須將該成員聲明為虛擬。只是通過在該成員的傳回型別之前添加virtual關鍵字來實現。子類可以選擇使用override關鍵字,講父類實現替換為它自己的實現,這就是方法重寫override,或方法覆寫。
不同的對象可以執行相同的動作,但要通過它們自己的實現代碼來執行。
多態的原理是當方法被調用時,無論對象是否被轉換為其父類,都只有位於對象繼承鏈最末端的方法實現會被調用。虛方法是按照其運行時類型而非編譯時間類型進行動態綁定調用的。
多態: 父類中virtual定義方法體 ,子類中通過override來具體實現
(不同的子類,實現的方式可以不同)
A9.重構 類名和建構函式名都繼承父類(其中建構函式繼承的方式是 方法名:base(),然後子類中重寫實現的方法) 這樣調用的方法相同,但是實現的效果可以達到不同A10.抽象類別 把執行個體化沒有任何意義的父類(如Animal)改成抽象類別。允許把類和方法聲明為abstract,即抽象類別和抽象方法。
抽象方法沒有方法體,直接在括弧後加分號;
1)抽象類別不能執行個體化 2)抽象方法是必須被子類重寫的方法 3)如果類中包含抽象方法,那麼類就必須定義為抽象類別,不論是否還包含其中一般方法A11.介面 介面把隱式公用方法和屬性群組合起來,以封裝特定功能的一個集合。一旦實現了介面,類就可以支援介面所指定的所有屬性和成員。聲明介面在文法上和聲明抽象類別完全相同,但不允許提供介面中任何成員的執行方法。(介面不能執行個體化,不能有構造方法和欄位,不能有修飾符如public、private等;不能聲明虛擬或者靜態等)。實現介面的類就必須要實現介面中的所有方法和屬性。
抽象類別的抽象成員可被子類部分實現,介面的成員需要實作類別完全實現,一個類只能繼承一個抽象類別,但可以實現多個介面等等。
第一,類是對對象的抽象,抽象類別是對類的抽象,介面是對行為的抽象;
第二,如果行為跨越不同類的對象,可使用介面;對於一些類似的類對象,用繼承抽象類別;
第三,從設計角度講,抽象類別是從子類中發現了公用的東西,泛化出父類,然後子類繼承父類,而介面是根本不知道子類的存在,方法如何?還不確定,預先定義。
(抽象類別是自底而上抽象出來的,而介面是自頂向下設計出來的)A12.集合 數組的容量是固定的,而ArrayList的容量是可根據需要自動擴充的。
(ArrayList是System.Collections下的一部分,使用大小可按需動態增加的數組實現IList介面)A13.泛型 聲明一泛型變數,如:IList<Animal> arrayAnimal; (IList或List均可)
arrayAnimal=new List<Animal>();
arrayAnimal.Add(new Cat("小花"));... A7.繼承
class Animal
{
protected string name="";
public Animal(string name)
{this.name=name;}
public Animal()
{this.name="無名";}
protected int shoutNum=3;
public int ShoutNum
{
get {return shoutNum;}
set {shoutNum=value; }
}
}
class Cat : Animal
{
public Cat () :base ()
{}
public Cat(string 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)
{}
public string Shout()
{
string result="";
for(int i=0;i<shoutNum;i++)
{result += "汪, ";}
return "我的名字叫"+ name + ""+ result;
}
}A8.多態
class Animal
{
public virtual string Shout() //虛方法,可以被子類重寫
{ return ""; }
}
class Cat : Animal
{
public Cat():base()
{}
public Cat(string name):base(name)
{}
public override 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 override string Shout()
{
string result="";
for(int i=0;i<shoutNum;i++)
{
result+="汪, ";
}
return "我的名字叫"+ name + " "+result;
}
}private Animal[] arrayAnimal;
private void button1_Click(object sender,EventArgs e)
{
arrayAnimal=new Animal[5];
arrayAnimal[0]=new Cat("小花");
arrayAnimal[1]=new Dog("阿毛");
arrayAnimal[2]=new Dog("小黑");
arrayAnimal[3]=new Cat("嬌嬌");
arrayAnimal[4]=new Cat("咪咪");
}
private void button2_Click(object sender,EventArgs e)
{
//由於多態性,所以叫的時候,會不同;程式會自動去找item是什麼對象,如Cat,Dog
foreach(Animal item in arrayAnimal)
{ MessageBox.Show(item.Shout()); }
}A10.抽象類別
abstract class Animal
{
protected abstract string getShoutSound();//沒有方法體,直接加分號
}
//只要類中有抽象方法,則該類一定是抽象類別;
//繼承抽象類別一定要實現抽象類別的方法(即重寫)
A11.介面
interface IChange
{
string ChangeThing(string thing); //表示返回sting型
}
class MachineCat:Cat,IChange //繼承 Cat,並實現IChange介面
{
public MachineCat():base()
{}
public MachineCat(string name):base(name)
{}
public string ChangeThing(string thing)//實現介面的方法
{return base.Shout()+"我有萬能口袋,我可變出:"+thing;}
}
private void button1_Click(object sender,EventArgs e)
{
MachineCat mcat=new MachineCat("叮噹");
StoneMonkey wukong=new StoneMonkey("孫悟空"); IChange [] array=new IChange[2];
array[0]=mcat;
array[1]=wukong; //利用多態性實現不同的ChangeThing
MessageBox.Show(array[0].ChangeThing("各種各樣的東西!"));
MessageBox.Show(array[1].ChangeThing("各種各樣的東西!"));
} 設計模式380 委託和事件護眼色度值:
色調85
飽和度90
亮度205