作者dedek (我要快乐起来)
看板C_Sharp
标题Re: [问题] new,virtual,override的问题
时间Wed Mar 31 21:05:44 2010
P大请教一下,您举的例子
父类别A的 public virtual void Print()
{
Console.WriteLine( "This is A.Print" );
}
在这边如果父类别无法加上去virtual这修饰词,让子类别去override该怎麽办?
我遇到的情况是 使用visual studio 时候,写web form, 里面内建的一个物件
想要去继承这物件的类别,然後去override
但是系统现有的类别要怎麽去加virtual这修饰词呢?
※ 引述《petrushka (不放过自己)》之铭言:
: 不太会用言语说明, 就简单贴个程式码上来, 希望你可以理解它们的差异:
: 首先看 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: 114.43.99.246
1F:推 petrushka:系统内建类别当然我们没有办法去更动它 03/31 21:31
2F:→ petrushka:如果内建类别无法支援你的需求,就只有自行实作全部了 03/31 21:32
3F:→ petrushka:或是你可以描述更多你的web form想要做的事,或许有别的 03/31 21:33
4F:→ petrushka:建议可以给你 03/31 21:33