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