淺談 new 與 overdrive 差別
程式語言有一種現象跟82法則有點相似的感覺,那就是一般情況下一般人80%撰寫的程式只用到程式語言本身20%的功能,很多功能是為求彈性或是少數狀況方便而設計,但多數情況其實是備而不用(功能spec本來就是要超需求..用不到頂多不用,但缺spec就不行了),不過多知道一些感覺就是會比較有學問.
以跟override相似的new來說就是這樣,容易混淆,其實說真的完全不知道相似override的new功能也就算了,因為我連用都沒用過....至於這兩者有何差異???
有一篇解釋得很不錯 https://dotblogs.com.tw/skychang/2012/05/10/72114
我只是再簡化成更減單的sample,給自己方便記憶
第一個對照例子....
class test1
{
public virtual void testa()
{
Console.WriteLine("1");
}
public void test()
{
testa();
}
}
class test2 : test1
{
public new void testa()
{
Console.WriteLine("2");
}
}
private void button1_Click(object sender, EventArgs e)
{
test1 a1 = new test2();
a1.testa();//輸出1
}
class test1
{
public virtual void testa()
{
Console.WriteLine("1");
}
public void test()
{
testa();
}
}
class test2 : test1
{
public override void testa()
{
Console.WriteLine("2");
}
}
private void button1_Click(object sender, EventArgs e)
{
test1 a1 = new test2();
a1.testa();//輸出2
}
第二個對照例子
class test1
{
public virtual void testa()
{
Console.WriteLine("1");
}
public void test()
{
testa();
}
}
class test2 : test1
{
public new void testa()
{
Console.WriteLine("2");
}
}
private void button1_Click(object sender, EventArgs e)
{
test2 a2 = new test2();
a2.test();//輸出1
}
class test1
{
public virtual void testa()
{
Console.WriteLine("1");
}
public void test()
{
testa();
}
}
class test2 : test1
{
public override void testa()
{
Console.WriteLine("2");
}
}
private void button1_Click(object sender, EventArgs e)
{
test2 a2 = new test2();
a2.test();//輸出2
}
簡單來說...根本沒必要用new...當你真的哪天在特殊情況下不得不用時自然會去用到,否則當不知道new用法的存在也可以.