先嘮叨幾點,把思路理清楚:
1.抽象類方法和虛方法都可以重寫,但是我們專業的說:我們把抽象方法“實現”了,我們把 虛方法 “重寫”了
2.抽象類沒有實例,所以抽象方法也不能被直接調用(沒有方法體)並且可以實現,抽象類可以寫虛方法並且可以重寫
3.虛方法可以再非抽象類與 抽象類內存在,虛方法在非抽象類里存在並且可以被實例調用
4.override 與重載是2個概念,重寫與重載 在字面上就不同
5.override 在派生類重寫父類方法的時候,凡是調用這個方法,我不管是直接調用這個方法,還是通過方法調用方法,他都是調用的重寫的方法。
6.new 注意:條件 當派生類與父類的方法名 一樣的時候存在,不然會報錯(你用new 一個父類不存在的方法,那是無意義的)
7.new 用了,new是新的意思,只要生成了一個獨立於父類的方法,把父類的方法隱藏了,這個方法必然是與父類的方法同名,那么派生類的這個方法與父類的這個方法,雖然字面上一樣,但是他們沒有半點關系,是相互獨立的。但是可以調用父類的方法。
下面結合案例來分析:
class Test
{
static void Main()
{
Father father = new Father();
father.Speaking1();//The Father Method
father.Speaking2();//The Father Method
Child child = new Child();
child.Speaking1();//The Child Method
child.Speaking2();//The Child Method
}
}
class Father
{
public virtual void Speaking1()
{
Console.WriteLine("The Father Method ");
}
public virtual void Speaking2()
{
Speaking1();
}
}
class Child:Father
{
public override void Speaking1()
{
Console.WriteLine("The Child Method");
}
}
override的情況:
1.當重寫餓了speaking1,不管是怎么調用這個方法,是直接調用,還是通過方法再調用,都是調用的重寫的方法
new的情況:
Father father = new Father();
father.Speaking1();//The Father Method
father.Speaking2();//The Father Method
Child child = new Child();
child.Speaking1();//The Child Method
child.Speaking2();//The Father Method 不同了
new之后,speaking1 方法獨立了,通過speaking2方法調用的時候,它是調用了Father的方法。
注:如果使用了new,但是這個方法父類沒有,那么會提示“不會隱藏繼承的成員,不需要使用new”
new:雖然new隱藏了父類的方法,但是可以調用父類的方法
class Test
{
static void Main()
{
Child child = new Child();
child.Speaking1();// The Father Method The Child Method
child.Speaking2();//The Father Method
}
}
class Father
{
public virtual void Speaking1()
{
Console.WriteLine("The Father Method ");
}
public virtual void Speaking2()
{
Speaking1();
}
}
class Child:Father
{
public new void Speaking1()
{
base.Speaking1();
Console.WriteLine("The Child Method");
}
}
關於new與virtual共同存在:
class Test
{
static void Main()
{
Third third = new Third();
third.Speaking2();//The Father Method
third.Speaking1();//The Third Method
}
}
class Father
{
public virtual void Speaking1()
{
Console.WriteLine("The Father Method ");
}
public virtual void Speaking2()
{
Speaking1();
}
}
class Child:Father
{
public new virtual void Speaking1()
{
base.Speaking1();
Console.WriteLine("The Child Method");
}
}
class Third : Child
{
public override void Speaking1()
{
Console.WriteLine("The Third Method");
}
}
分析:
1.因為Third類重寫的是Child類的speaking1方法(繼承於child的方法而不是Father的方法):(與Child類似,與基類的speaking1是獨立的方法)
注:基類的virtual無法擴展到new的方法上。(因為他們是獨立的)
third.Speaking2();調用基類的speaking2方法里的speaking1是基類的方法