上一節中我們學習到了構造函數,用來初始化一個對象的實例。同時在.Net Framework中,提供了析構函數用於清理對象。一般情況下不需要特別析構函數,系統會自動提供默認的析構函數來執行操作,清理不再需要的對象。
一、 靜態和實例類成員
屬性,方法和字段等成員是對象實例所特有的,此外還有靜態成員。例如靜態方法,屬性和字段。這些靜態的成員可以在類的不同實例之間共享。所以將他們可以看成是類的全局對象。靜態屬性和字段可以訪問獨立於任何對象實例的數據。在使用靜態成員時候,不需要實例化對象。
前面在應用控制台程序中用到很多的輸入和輸出,其實他們都是靜態方法。不需要實例化Console 和Convert就可以直接調用。如果嘗試實例化一個靜態方法或者類的話會引起操作失敗。
靜態類:平時我們都希望類只包含靜態成員,而且不能用於實例化對象,為此一種簡單的方法是使用靜態類,而不是把類的構造函數設置為私有。靜態類只有靜態成員,不需要構造函數的定義。因為靜態類是不允許實例化的。
二.接口
接口是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合,一但定義了接口,就在類中實現它,這樣類就支持接口中所指定的所有屬性和成員。
同時要注意的是,接口不能單獨存在,不能像實例化對象一樣實例化一個接口,接口不能包含實現其成員的任何代碼,而只能定義成員本身,實現過程必須在實現接口的類中實現。一個類可以支持多個接口,同時一個接口也可以在多個類中實現。
二、 繼承
繼承是OOP最重要的特性之一,任何類都可以從另一個類中繼承,但是每一個類只能繼承幾個基本類。被繼承的類叫做父類,繼承的類稱為子類。一個很重要的問題是,在繼承一個基類的時候,成員的訪問性成了一個很重要的問題。一個類從一個基類繼承後,就得到它的所有成員和屬性以及字段。現在看Student類繼承Person類後的情況:class Student : Person 表示Student類繼承Person類
class Person //Person類
{
public string name;
public string sex;
public int age;
public double weight;
public Person()//構造函數
{
name = "Lu xiaofeng";
sex = "man";
age = 22;
weight = 99;
}
public Person(string name, string sex, int age, double weight)
{
this.name = name;
this.sex = sex;
this.age = age;
this.weight = weight;
}//構造函數
public void Eat(double food)
{//方法,吃東西後體重增加
this.weight += food;
}
}
class Student : Person
{
public string school_name;
public double score;
public int grade;
public Student()
{
school_name = "csu";
score = 99;
grade = 1;
}
public void study(double hours)
{
this.weight -= hours;
}
}
class Student 繼承 Person後它所擁有的方法和屬性包括其父類的所有屬性和方法
現在來比較下一個Person類和一個Student類的區別。
Person man = new Person("lixiao", "woman", 11, 88);
Console.WriteLine(" Person方法和屬性");
Console.WriteLine("name={0},sex={1},age={2},weight={3}",
man.name, man.sex, man.age, man.weight);man.Eat(12);
Console.WriteLine("man.Eat(12);", man.weight);
Student Luxiaofeng = new Student();
Console.WriteLine("Student方法和屬性");
Console.WriteLine("Luxiaofeng.name={0},Luxiaofeng.sex={1},Luxiaofeng.age={2},Luxiaofeng.weight={3}",Luxiaofeng.name,Luxiaofeng.sex,Luxiaofeng.age,Luxiaofeng.weight); //調用父類的屬性
Console.WriteLine("Luxiaofeng.school_name={0},Luxiaofeng.score={1},Luxiaofeng.grade={2}",Luxiaofeng.school_name,Luxiaofeng.score,Luxiaofeng.grade);//自己的屬性
Console.WriteLine("Luxiaofeng.weight={0}", Luxiaofeng.weight);
Luxiaofeng.Eat(14);//調用父類的方法
Console.WriteLine("Luxiaofeng.weight={0}", Luxiaofeng.weight);
Luxiaofeng.study(18);//調用自己的方法
Console.WriteLine("Luxiaofeng.weight={0}", Luxiaofeng.weight);
輸出的結果如下:
總結下:
C#中的繼承符合下列規則:
1、繼承是可傳遞的。如果C從B中派生,B又從A中派生,那麼C不僅繼承了B中聲明的成員,同樣也繼承了A中的成員。Object 類作為所有類的基類。
2、派生類應當是對基類的擴展。派生類可以添加新的成員,但不能除去已經繼承的成員的定義。
3派生類如果定義了與繼承而來的成員同名的新成員,就可以覆蓋已繼承的成員。但這並不因為這派生類刪除了這些成員,只是不能再訪問這些成員。
4可以定義虛方法、虛屬性以及虛索引指示器,它的派生類能夠重載這些成員,從而實現類可以展示出多態性。
5派生類只能從一個類中繼承,可以通過接口現多重繼承。