作者petrushka (不放过自己)
看板C_Sharp
标题Re: [问题] new,virtual,override的问题
时间Thu Apr 9 13:45:20 2009
不太会用言语说明, 就简单贴个程式码上来, 希望你可以理解它们的差异:
首先看 new 这个修饰词:
class A
{
public void Print()
{
Console.WriteLine( "This is A.Print" );
}
}
class B : A
{
public new void Print()
{
Console.WriteLine( "This is B.Print" );
}
}
static void Main( string[] args )
{
A obj = new B(); // 用父类别介面指向子类别物件
obj.Print(); // 会印出 "This is A.Print"
Console.ReadKey();
}
所以 new 这个修饰词在上述情形时, 是无效果的.
再看 override 这个修饰词:
class A
{
public virtual void Print() // 使用 virtual 修饰词
{
Console.WriteLine( "This is A.Print" );
}
}
class B : A
{
public override void Print() // 使用 override 修饰词
{
Console.WriteLine( "This is B.Print" );
}
}
static void Main( string[] args )
{
A obj = new B(); // 用父类别介面指向子类别物件
obj.Print(); // 印出 "This is B.Print"
Console.ReadKey();
}
在上述情况, 执行 Print() 并不会调用到父类别的实作
※ 引述《Kelunyang (可伦)》之铭言:
: 是这样的,小弟这学期修了一堂物件导向程式设计
: 老师上课是用Java,不过小弟想说学过C#,也就来C#用用看
: 後来在老师上课提到Java的所有method都是virtual的,而C#和C++必须要被指定
: 小弟回家之後就自己打开VS来玩玩看
: 结果发现就算不加virtual,在继承的时候也没有看出来有什麽差异
: 去翻了MSDN看到了new和override这两个修饰子(小弟原本就知道有override)
: 然後根据MSDN的说法
: http://msdn.microsoft.com/zh-tw/library/6fawty39(VS.80).aspx
: 好像是如果子类别没有加上new或是override,编译器会自己补上new
: 那小弟这边概念有点搞混了,到底用new和override有什麽差异呢?
: 另外,MSDN说base中的方法应该要加上virtual,但是小弟自己实作时发现就算
: 不加上virtual一样可以做到继承,整个感觉就是蛮怪的囧
: 那就希望版上的高手帮小弟解答了@@"
--
对於已经无法拥有的
唯一能做的是
不要忘记
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.125.251.225
1F:→ petrushka:所以MSDN中base class的method应该加上virtual是较佳的 04/09 13:47
2F:→ petrushka:它会那样说,是避免执行到非你预期中的method 04/09 13:48
3F:推 Kelunyang:喔喔喔喔喔!我看懂了,谢谢pet大! 04/09 18:51
4F:推 habit22:喔喔喔~原来是这个意思喔~我一直到今天才知道XD 04/09 23:50
5F:推 tomex:各语言名词或有不同,这篇用示范就很清楚,m文起来 04/11 07:40
6F:推 maxi326:好文! 04/18 17:04