interface用來聲明介面 1.只提供方法的規則約束,不提供方法的主體。 例: public interface IPerson { void getName();//不包含主體方法 } 2.方法不能用public abstract等修飾,無欄位變數,無建構函式。 3.方法可包含參數 如 public interface IPerson { void getAge(string s); } 例1 public interface IPerson { IPerson();//錯誤 string name;//錯誤 public void getIDcard();//錯誤 void getName();//正確 void getAge(string s);//正確 } 實現interface的類 1.與繼承類的格式一致,如 public class Chinese:IPerson{} 2.必須實現interface中的各個方法 例2,繼承例1 public class Chinese:IPerson { public Chinese(){}//添加建構函式 public void getName(){}//實現getName() public void getAge(){}//實現getAge() } abstract用來聲明抽象類別、抽象方法 1.抽象方法所在類必須為抽象類別。 2.抽象類別不能直接執行個體化,必須由其衍生類別實現。 3.抽象方法不包含方法主體,必須由衍生類別以override方式實現此方法,這點跟interface中的方法類似 如 public abstract class Book { public Book() { } public abstract void getPrice(); //抽象方法,不含主體 public virtual void getName() //虛方法,可覆蓋 { Console.WriteLine("this is a test:virtual getName()"); } public virtual void getContent() //虛方法,可覆蓋 { Console.WriteLine("this is a test:virtual getContent()"); } public void getDate() //一般方法,若在衍生類別中重寫,須使用new關鍵字 { Console.WriteLine("this is a test: void getDate()"); } } public class JavaBook:Book { public override void getPrice() //實現抽象方法,必須實現 { Console.WriteLine("this is a test:JavaBook override abstract getPrice()"); } public override void getName() //覆蓋原方法,不是必須的 { Console.WriteLine("this is a test:JavaBook override virtual getName()"); } } 測試如下: public class test { public test() { JavaBook jbook=new JavaBook(); jbook.getPrice(); //將調用JavaBook中getPrice() jbook.getName(); //將調用JavaBook中getName() jbook.getContent(); //將調用Book中getContent() jbook.getDate(); //將調用Book中getDate() } public static void Main() {test t=new test(); } } virtual標記方法為虛方法 1.可在衍生類別中以override覆蓋此方法 2.不覆蓋也可由對象調用 3.無此標記的方法(也無其他標記),重寫時需用new隱藏原方法 abstract與virtual: 方法重寫時都使用 override 關鍵字 interface中的方法和abstract方法都要求實現 overrid和new //override不能重寫非虛方法或靜態方法。 //所重寫的基方法必須是虛擬、抽象的或重寫的。 //所以說虛(virtual)成員與重寫(override)成員是配對使用的, //雖然也可以用new來"隱藏"虛成員 //下面通過例子來看看重寫與隱藏的區別,從而進一步理解虛成員的作用。 //重寫部分---------- public class MyBaseClass { public virtual void DoSomething() { Console.WriteLine("Base imp"); } } public class MyDerivedClass:MyBaseClass { public override void DoSomething() ( Console.WriteLine("Derived imp"); } } //其中重寫方法將替換基類中的執行代碼,這樣下面的代碼就將使用替換代碼, //即使這是通過基類進行的,情況也是這樣: MyDerivedClass myObj=new MyDerivedClass(); MyBaseClass myBaseObj; myBaseObj=myObj; myBaseObj.DoSomething(); //結果如下: Derived imp //另外,還可以使用下面的程式碼後置基類方法: public class MyBaseClass { public virtual void DoSomething() { Console.WriteLine("Base imp"); } } public class MyDerivedClass:MyBaseClass { new public void DoSomething() { Console.WriteLine("Derived imp"); } } //基類方法不必是虛擬,但結果是一樣的,上面的代碼只需要修改行。 //對於基類的虛擬方法和非虛擬方法來說,其結果如下: Base imp //儘管隱藏了基類的執行代碼,但仍可以通過基類訪問它。 |