|
1. new和override區(qū)別
override在子類中重寫基類的方法;new在子類中為基類同名(virtual)方法添加一個(gè)新的版本,會(huì)保留基類的同名(virtual)方法。 下面的例子詳細(xì)的展示它們的區(qū)別: public class BaseClass
{ public BaseClass() { } public virtual void Test() { Console.WriteLine("Test() in BaseClass"); } } public class DerivedClass1 : BaseClass { public override void Test() { Console.WriteLine("Test() in DerivedClass1"); base.Test(); } } public class DerivedClass2 : BaseClass { public new void Test() { Console.WriteLine("Test() in DerivedClass2"); base.Test(); } } class Program
輸出如下,可以看到使用new時(shí),如果將實(shí)例轉(zhuǎn)換為基類類型,調(diào)用的方法為基類的方法:{ static void Main(string[] args) { DerivedClass1 class1 = new DerivedClass1(); class1.Test(); Console.WriteLine("-----------------------"); DerivedClass2 class2 = new DerivedClass2(); class2.Test(); Console.WriteLine("-----------------------"); BaseClass baseclass; baseclass = class1 as BaseClass; baseclass.Test(); Console.WriteLine("-----------------------"); baseclass = class2 as BaseClass; baseclass.Test(); Console.WriteLine("-----------------------"); Console.ReadLine(); } } Test() in DerivedClass1 Test() in BaseClass ----------------------- Test() in DerivedClass2 Test() in BaseClass ----------------------- Test() in DerivedClass1 Test() in BaseClass ----------------------- Test() in BaseClass ----------------------- 如果基類的同名方法不給出new和override修飾符,.Net默認(rèn)采用new的方式,編譯時(shí)將產(chǎn)生一條警告信息。 2. 關(guān)于static的構(gòu)造函數(shù) static的構(gòu)造函數(shù)將在第一次使用該類的地方被調(diào)用。例如第一次調(diào)用該類的靜態(tài)方法、屬性,或者第一次實(shí)例化該類的一個(gè)對(duì)象等。 3. abstract, virtual abstract的類不能實(shí)例化,只能用于子類繼承。 abstract的方法隱式的就是一個(gè)virtual方法;abstract的方法子類必須實(shí)現(xiàn);abstract方法只能有聲明,不能包含實(shí)現(xiàn)。 virtual方法提供給子類重寫;可以包含實(shí)現(xiàn)。 4. as和強(qiáng)制類型轉(zhuǎn)換 強(qiáng)制類型轉(zhuǎn)換:MyClass myclass=(MyClass)obj; 使用as:MyClass myclass=obj as MyClass; 區(qū)別在于,如果obj不能被轉(zhuǎn)換成MyClass類型,強(qiáng)制類型轉(zhuǎn)換會(huì)拋出異常,而使用as時(shí)不會(huì)有異常,只是轉(zhuǎn)換結(jié)果(myclass變量)的值為null。 |
|
|