C#繼承
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
一、繼承的類型 class MyDerivedClass:MyBaseClass C#不支持私有繼承,所以基類名上沒有public或private限定符。{ //function and data members here } 類派生于接口,則用都好分隔。 2.1 虛方法 在C#中可以把在方法或者屬性的前面加上virtual,聲明基類的方法為虛方法或者虛屬性,虛方法和虛屬性的規(guī)則相同。語法如下: class MyBaseClass 在C#中,方法在默認的情況下不是虛擬的,但(除構(gòu)造函數(shù)以外)可以顯示的聲明。派生類重寫基類的虛方法時,要使用override關鍵字顯示聲明:{ public virtual string VirtualMethod() { return "this method is virtual and define in MyBaseClass"; } } 注意:成員字段和靜態(tài)函數(shù)不能被聲明為virtual,因為這個概念只對類中的實例函數(shù)成員有意義。 2.2 隱藏方法 如果在基類和派生類中都聲明了簽名相同的方法,而基類中的方法又沒有聲明為virtual,派生類中的方法也沒有聲明成override,則派生類方法就會隱藏基類方法。結(jié)果是調(diào)用哪個類的方法取決于引用實例的變量類型,而不是實例本身的類型。 2.3 調(diào)用函數(shù)的基本版本 C#有一種特殊的語法用于從派生類中調(diào)用方法的基本版本:base.<MethodName>()。 2.4 抽象類和抽象函數(shù) C#中的抽象類要聲明為abstract,抽象類不能實例化,抽象函數(shù)沒有執(zhí)行代碼,必須在非抽象的派生類中重寫。顯然抽象函數(shù)也是虛擬的,但不需要提供virtual關鍵字,而用abstract關鍵字。如果類包含了抽象函數(shù),那么該類也是抽象的,類必須用abstract聲明。 absttact class Building 2.5 密封類和密封方法{ public abstract decimal CalculateHeatingCost();//abstract method } C#允許把類和方法聲明為sealed,對于類來說,這表示不能繼承該類;對于方法來說,這表示不能重寫該方法。 sealed class FinalClass 2.6 派生類的構(gòu)造函數(shù){ } 在創(chuàng)建派生類的實例時,實際上會有多個構(gòu)造函數(shù)在起作用。實例化類的構(gòu)造函數(shù)本身不能初始化類,還必須調(diào)用基類中的構(gòu)造函數(shù)。即派生類的實例構(gòu)造是按層次結(jié)構(gòu)進行的,順序是先執(zhí)行基類的構(gòu)造函數(shù),再執(zhí)行派生類的構(gòu)造函數(shù)。 基類的構(gòu)造函數(shù)總是最先調(diào)用,那么派生類的構(gòu)造函數(shù)可以在執(zhí)行的過程中調(diào)用基類的方法、屬性和其他成員,因為基類已經(jīng)構(gòu)造出來了,其他字段也初始化了。 //在結(jié)構(gòu)層次中添加無參數(shù)的構(gòu)造函數(shù) 三、修飾符public abstract class GenericCustomer { private string name; public GenericCustomer():base() { name = "myName"; } } //在結(jié)構(gòu)層次中添加帶參數(shù)的構(gòu)造函數(shù) public class Nevermore60Customer:GenericCustomer { private int highCost; public Nevermore60Customer(string name):base(name) { this.highCost = 0; } } C#中完整的修飾符列表:
四、接口 接口中只能包含方法、屬性、索引器和事件的聲明。接口不能實例化,不能有構(gòu)造函數(shù)或字段,也不包含運算符重載。接口定義中還不允許聲明成員的修飾符,成員接口總是public的,不能聲明成virtual或者static 4.1 接口的定義和實現(xiàn) //定義 4.2 派生的接口namespace InterfaceTest { public interface IBankAccount { void PayIn(decimal amount); bool Withdraw(decimal amount); decimal Balance { get; } } } //實現(xiàn) namespace InterfaceTest { public class SaverAccount:IBankAccount { private decimal balance; public void PayIn(decimal amount) { balance += amount; } public bool Withdraw(decimal amount) { if(balance >= amount) { balance -= amount; return true; } Console.WriteLine("Withdrawal attempt failed."); return false; } public decimal Balance { get { return balance; } } public override string ToString() { return String.Format("Venus Bank Saver:Balance = {0,6:C}",balance); } } } 接口可以繼承,其方式與類的繼承相同。 該文章在 2017/2/7 18:52:32 編輯過 |
關鍵字查詢
相關文章
正在查詢... |