面向對象編程有很多特點,例如繼承,封裝,多態等。有關繼承的知識前面已經介紹了一點,現在來具體介紹下封裝和多態。
一.封裝
類是屬性和方法的集合,所謂封裝就是在具體定義了某個方法或者屬性以後,開發人員只要知道如何使用這些方法和屬性而不必要知道所調用的方法或者屬性的具體實現過程。猶如在開車過程中的剎車,駕駛員知道在某個時候剎車就可以了,但是不要去關注剎車的過程是怎麼實現的,這個是汽車設計員的工作。
Person man = new Person("lixiao", "woman", 11, 88); man.Eat(12);在上面這個小例子,我們創建了一個Person類對象man,調用Person類的方法Eat()--man.Eat(12),但是這個方法具體實現過程在這裡是不可見的。這就是所謂的封裝。
二.多態
多態是面向對象編程的一個重要特點,在C#環境下的多態就是重載和覆寫。關於重載這個概念以前講過:在一個類中,兩個以上的方法有著相同的名字,不同的參數類型,但是返回值可以不相同,猶如下面的例子。
public void hi()
{
Console.WriteLine("hi,C Sharp");
}
public void hi(string name)
{
Console.WriteLine("hi,{0}",name);
}
覆寫就是子類為了實現某一個功能而重復定義父類的某個方法,覆寫方法比重載方法要更加嚴格:只有虛方法和抽象方法才可以被覆寫,同時覆寫時必須滿足一下幾個條件:相同的方法名字,參數列表和返回值類型,缺一不可。
例如下面的例子:左邊的時基類Person中的一個方法,右邊的時Student類繼承 Person類後覆寫Getweight()方法的過程。
多態的一個結果就算派生於基類的類在方法和屬性上有一定的重疊,因此可以用相同的語法處理從同一個基類實例化的對象,比如類student和worker都是從Person類繼承下來的,那麼兩個子類的對象都可以調用Person類的eat()方法。
class Student : Person
Student Luxiaofeng = new Student();
Luxiaofeng.Eat(15);
class Work : Person
Work sub_work = new Work();
sub_work.Eat(15);
三.對象之間的關系
對象之間除了繼承這個簡單的關系之外還有兩種比較重要的關系:包含和集合。
1.包含關系:一個類包含另一個類,與繼承相比,包含類可以控制對被包含類的成員的訪問,甚至在使用被包含類的成員之前進行其他的處理。
2.集合關系:一個類用作類一個類的多個實例的容器,集合包含索引,排序和重新設計大小等功能。
對象的集合關系和數組的使用方法相似,例如定義一個集合:Student[] mystu = new Student[20];但是集合和數組的主要區別:集合通常可以執行額外的添加和刪除集合中的項的功能。而且集合有個Item屬性,它可以根據對象的索引返回該對象。
四.事件
對象可以激活事件,在C#的Window編程中經常要處理事件,例如按下一個按鈕或者點擊一些圖標會發生哪些事件,C#要編程處理這些引發的事件。在Window程序設計過程中,事件時必不可少的。下面先看一個簡單的Window應用程序。
int count = 0;
int coun1= 0;
private void button1_Click(object sender, EventArgs e)
{//點擊button1事件處理
count++;
textBox1.Text = count.ToString();
}
private void button2_Click(object sender, EventArgs e)
{//點擊button2 事件處理
count--;
textBox1.Text = count.ToString();
}
在Form1中添加Textbox,Label,Button控件各兩個,coun和coun1分別用來統計點擊兩個Button控件的次數,然後再顯示在TextBox上。
五.引用類型和數值類型
在C#中,數據根據變量的類型以兩種方式的一種存在一個變量中,這兩種方式分別是引用類型和值類型。兩者的區別主要是:
1、值類型在內存的一個地方存儲它們自己和它們的內容;
2、引用類型在內存中的一個地方存儲一個引用,另一個地方存儲內容。
到目前為止,所使用的String變量(引用類型)和其他簡單的變量(int)的方式完全一樣,只不過引用類型的值可以是null,而值類型總是包含一個值。string name=null; int id=0;如果定義了name後不賦值或者令它等於null,系統會提示:name沒有初始化。