new和override
?
先看override的情況:
public class A{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B : A
{
public B()
{
Console.WriteLine('B');
}
public override void Fun()
{
Console.WriteLine("B.Fun()");
}
}
聲明B類型的對象:
B test = new B();
test.Fun();
輸出結果是:
A
B
B.Fun()
該結果中,先輸出A,在輸出B,說明初始化的時候,先執行基類,再執行化子類的構造函數
聲明A類型的對象:
A test = new B();
test.Fun();
運行結果:
A
B
B.Fun()
說明無論是父類型還是子類型的對象 ,當使用override時,父類的虛函數完全被子類的函數給“覆蓋”了。
?
再來看new的情況:
public class A{
public A()
{
Console.WriteLine('A');
}
public virtual void Fun()
{
Console.WriteLine("A.Fun()");
}
}
public class B : A
{
public B()
{
Console.WriteLine('B');
}
public new void Fun()
{
Console.WriteLine("B.Fun()");
}
}
?
聲明B類型的對象:
B test = new B();
test.Fun();
輸出結果是:
A
B
B.Fun() ----此時與override的效果相同
聲明A類型的對象:
A test = new B();
test.Fun();
運行結果:
A
B
A.Fun() ----此時,與override的情況不一樣了。。。
?
結論:
1.new聲明的方法,當使用子類的類型來調用的時候,它會運行子類中的函數,當類型是基類的話 ,則使用基類的函數來執行,可以簡單的記憶:
override--覆蓋(父類的沒了,始終是兒子)--取決于對象的實際類型,new--新的(父子共存)--取決于對象的聲明類型。
PS:只有使用virtual定義基類中的函數,并使用override標記子類的函數,才可以達到多態類----始終調用子類的方法
2.子類中override父類的方法,父類的方法一定要是virtual,而在子類中new父類的方法,父類的方法不一定要是virtual,virtual和override是多態,new不是多態
3.抽象類中的抽象方法,必須要被子類override,不能new
4.override可以與sealed關鍵詞連用: sealed override void F(),而new不行。被sealed修飾過的方法,不能再被子類重寫
?
再來一道復雜點的網上看到的面試題:
public class A{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
public class B : A
{
public override void Fun1(int i)
{
base.Fun1(i + 1);
}
}
?
B b = new B();
A a = new A();
a.Fun2(b);
b.Fun2(a);
運行上面語句,執行結果是什么?
先分析a.Fun2(b):傳入的參數是B類型的,因此a.Fun1(1)執行的是B類型對象的Fun1方法,運行結果是2
然后執行Fun1(5),由于運行的是A類型對象的Fun2方法,Fun1自然就是A中的Fun1,運行結果是5
再分析b.Fun2(a):傳入的參數是A類型的,因此a.Fun1(1)執行的是A類型對象的Fun1方法,運行結果是1
然后運行Fun1(5),由于運行的是B類型對象的Fun2方法,此時的Fun1已經被B覆蓋掉了,因此執行的是被覆蓋后的方法,運行結果是6
?
那么如果把B類中的override改成new,情況會是什么樣呢?
由于public void Fun2(A a)的參數類型始終是A類型(當傳入B類型時,會轉成A類型,相當于A a =? new B()的效果),而用new不會覆蓋父類的方法,因此結果是:
1
5
1
5
?
轉載于:https://www.cnblogs.com/shandong/archive/2012/08/01/2617610.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的new和override的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phpstrtotime()对于31日求
- 下一篇: php目录间拷贝文件方法