繼承問題,麻煩高手指點迷津!頂者有分,不夠再加!!!

zsh0809 2009-05-15 04:23:20
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace OOTest
{
public class Father
{
public virtual void TestVoice()
{
Console.WriteLine("Father_TestVoice");
}

public void Test()
{
Console.WriteLine("Father Test");
}
}

public class Son : Father
{
public void SonVoice()
{
Console.WriteLine("Father_TestVoice");
}
public override void TestVoice()
{
Console.WriteLine("Son_TestVoice");
}

public new void Test()
{
Console.WriteLine("Son Test");
}

public static void Main()
{
Father son = new Son();
son.TestVoice();
son.Test();
((Father)son).TestVoice();

}
}
}

執行結果,我知道。請高手詳細分析程序執行結果。尤其是son.Test()的執行爲什麽直接去Father類中執行方法,而不是執行子類Son中的方法,謝謝。
...全文
138 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2009-05-16
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wartim 的回复:]
你这样容易把自己搞晕,我先改个名字
public static void Main()
{
Father WhoAmI = new Son();
WhoAmI.TestVoice();
WhoAmI.Test();
((Father)WhoAmI).TestVoice();

}

首先
WhoAmI.TestVoice();
((Father)WhoAmI).TestVoice();
是一样的,因为WhoAmI本来就被你定义为Father类型,
Father WhoAmI = new Son()…
[/Quote]
谢谢,我明白了许多,谢谢。
youlanse 2009-05-16
  • 打赏
  • 举报
回复
领悟中....
wartim 2009-05-16
  • 打赏
  • 举报
回复
而你son的test是new重写的,和father无关,只是起个保持和father里同名好用son去实例化father的作用,因为用的是把son里的名字的作为要实例化的方法名而已,而实例化本身是根据father的
wartim 2009-05-16
  • 打赏
  • 举报
回复
简单说就是new 只是给个范围,告诉类里的哪些内容要被初始化,
wartim 2009-05-16
  • 打赏
  • 举报
回复
你这样容易把自己搞晕,我先改个名字
public static void Main()
{
Father WhoAmI = new Son();
WhoAmI.TestVoice();
WhoAmI.Test();
((Father)WhoAmI).TestVoice();

}

首先
WhoAmI.TestVoice();
((Father)WhoAmI).TestVoice();
是一样的,因为WhoAmI本来就被你定义为Father类型,
Father WhoAmI = new Son();
所以这个转换是多余的
然后
之所以
WhoAmI.Test();是调用Father的,因为它本身就是Father类型的。
Father WhoAmI = new Son();
这句是说WhoAmI类型还是Father的,调用它的方法还是在调用这个Father类型里的方法
只是由Son类去实例化它,但变量的类型是不会随着你new的实例的类型而改变的,
这里只有一个初始化是否彻底的问题,是拿son类中也有的father类的那一部分去"初始化"这个定义的father实例,而前提是son的“空间”要小于等于father的“空间”
比如
father
{
public int a=1;
}

son:father
{
public int b=2;
}

father f=new son()
Console.WriteLine(f.b);
是通不过的编译的,因为father里没有b

father
{
public int a=1;
public int b=2;
}

son:father
{
public int b=3;
}

father f=new son()
Console.WriteLine(f.b);

的结果是 f.b=2 而不会是 f.b=3 ,因为还是在用father类实例化它,
这只是为了代码方便其实本身没有什么意义的,极端的例子就是
father
{
public int a=1;
public int b=2;
}

son:father
{
}

father f=new son()
Console.WriteLine(f.b);

son 里什么都没有,照样会实例化,而且结果是f.b=2
既然什么都可以没有,那就是接口的原型了,就可以写成

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication24
{
class Program
{
public class Father : Son
{
public int a = 1;
public int b = 2;

public int getb()
{
return b;
}
}

public interface Son
{
int getb();
}

public static void Main()
{
Son f = new Father();
Console.WriteLine(f.getb());
Console.Read();
}
}
}

不过我这个例子举得不是很好,因为接口是不能包含字段的,所以应该举个纯方法的例子
「已注销」 2009-05-16
  • 打赏
  • 举报
回复

minjiaquan 2009-05-16
  • 打赏
  • 举报
回复
顶!
「已注销」 2009-05-16
  • 打赏
  • 举报
回复
顶一个
没有昵称阿 2009-05-15
  • 打赏
  • 举报
回复
学习了!
dony_feng 2009-05-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 CGabriel 的回复:]
引用 9 楼 zsh0809 的回复:
引用 5 楼 jingshuaizh 的回复:
son.Test()的執行爲什麽直接去Father類中執行方法,而不是執行子類Son中的方法

Father son = new Son();
这里 定义的 实际上是一个 Father 的 实例, son 继承自 Father 当然 也 继承了 Father.test();

所以 执行Father.test();


從程序運行的絕度來看這個問題是這么回事,son在編譯的時候是Father類的,但在運行的時候是Son的對象呀,您運行的時候斷點看…
[/Quote]

正解,再也没有虚方法供son去改写
hangang7403 2009-05-15
  • 打赏
  • 举报
回复
up
「已注销」 2009-05-15
  • 打赏
  • 举报
回复
顶一下
zhushoudong 2009-05-15
  • 打赏
  • 举报
回复
支持二楼的看法
zhifan316 2009-05-15
  • 打赏
  • 举报
回复
feifeiyiwen 2009-05-15
  • 打赏
  • 举报
回复
望高手發表高見!
「已注销」 2009-05-15
  • 打赏
  • 举报
回复
再頂一下,望高手發表高見!
「已注销」 2009-05-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 CGabriel 的回复:]
引用 9 楼 zsh0809 的回复:
引用 5 楼 jingshuaizh 的回复:
son.Test()的執行爲什麽直接去Father類中執行方法,而不是執行子類Son中的方法

Father son = new Son();
这里 定义的 实际上是一个 Father 的 实例, son 继承自 Father 当然 也 继承了 Father.test();

所以 执行Father.test();


從程序運行的絕度來看這個問題是這么回事,son在編譯的時候是Father類的,但在運行的時候是Son的對象呀,您運行的時候…
[/Quote]
你說的這個問題我也發現,Son裡面有個沒使用的方法就是我來試驗的。
CGabriel 2009-05-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zsh0809 的回复:]
引用 5 楼 jingshuaizh 的回复:
son.Test()的執行爲什麽直接去Father類中執行方法,而不是執行子類Son中的方法

Father son = new Son();
这里 定义的 实际上是一个 Father 的 实例, son 继承自 Father 当然 也 继承了 Father.test();

所以 执行Father.test();


從程序運行的絕度來看這個問題是這么回事,son在編譯的時候是Father類的,但在運行的時候是Son的對象呀,您運行的時候斷點看一下就知道了,就這一點…
[/Quote]

姑且不论运行时 son 实例是否是 Son, 先看看编译器怎么说。

稍微改一下你的代码, 在 Son 类里面加一个函数
public void Test() {}

使用下面的代码:

Father son = new Son();
son.Test();

编译是不会通过的, 因为编译器认为对象 son 就是 Father 类的实例。


「已注销」 2009-05-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhubosa 的回复:]
virtual,override,new关键字的用法
override就是指调用的时候覆盖父类的方法,而是调用子类的方法,
new关键字是指覆盖子类的方法,而是调用父类的方法。
大概就是这样理解吧!
[/Quote]

糾正你一下:new关键字在這里的作用是隱藏父类方法。
「已注销」 2009-05-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jingshuaizh 的回复:]
son.Test()的執行爲什麽直接去Father類中執行方法,而不是執行子類Son中的方法

Father son = new Son();
这里 定义的 实际上是一个 Father 的 实例, son 继承自 Father 当然 也 继承了 Father.test();

所以 执行Father.test();
[/Quote]

從程序運行的絕度來看這個問題是這么回事,son在編譯的時候是Father類的,但在運行的時候是Son的對象呀,您運行的時候斷點看一下就知道了,就這一點我不是太理解。
加载更多回复(8)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧