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