C# 父类与子类

winlerman 2011-02-26 10:54:16
大家好,我是C#的初学者。
请问通过父类引用子类,从而来使用子类override方法,有什么实际用处。
(不通过父类引用子类,而直接通过子类的对象来调用该方法不是也可以实现吗?为什么要这么麻烦呢)

谢谢大家。
...全文
520 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyuainil 2012-01-30
  • 打赏
  • 举报
回复
自己写个简单的列子就知道了
abc0001234234 2011-02-28
  • 打赏
  • 举报
回复
建议自己写一个试试 就知道了
KeepDream 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lanlang_88 的回复:]
个人认为,在父类作为参数时最为明显。比如:
class A{
public virtual void t(){}
}
class B:A{
public override void t(){}
}
class C:A{
public override void t(){}
}

class test{
//如果te方法的参数为子类类型,要对子类进行重载
……
[/Quote]

这个不错,
wanghui0380 2011-02-28
  • 打赏
  • 举报
回复
实际用处??

当你了解中国文化了就知道他的实际用处了

偷梁换柱,瞒天过海,指鹿为马,暗渡陈仓-------全都典型的override,new的实际用处
IT0329 2011-02-28
  • 打赏
  • 举报
回复
7楼的比喻很到位啊
hztltgg 2011-02-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sp1234 的回复:]
你的程序声明一个“程序生成器”类型的变量来引用我,因为我确实有这个特性,所以编译器允许这样的程序存在并且给你编译为可执行的程序。在你的程序运行时,我的“程序生成器”方面的特性就被调动起来了。但是你知道我的具体类型是什么么?你不知道!

同时你的程序也可以用这个变量引用一个机器人程序对象实例,它的“程序生成器”方面的特性也被调动起来了。但是我和它虽然在“程序生成器”方面接口相同,但是显然必定有些……
[/Quote]

接分!
zzmsyt 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp1234 的回复:]
引用楼主 winlerman 的回复:
大家好,我是C#的初学者。
请问通过父类引用子类,从而来使用子类override方法,有什么实际用处。
(不通过父类引用子类,而直接通过子类的对象来调用该方法不是也可以实现吗?为什么要这么麻烦呢)

谢谢大家。


“通过父类引用子类”?这是典型的误区。

你声明一个变量的类型是父类,这只是声明,这时候没有什么子类概念。而当你实例化一个子……
[/Quote]
接分!
  • 打赏
  • 举报
回复
你的程序声明一个“程序生成器”类型的变量来引用我,因为我确实有这个特性,所以编译器允许这样的程序存在并且给你编译为可执行的程序。在你的程序运行时,我的“程序生成器”方面的特性就被调动起来了。但是你知道我的具体类型是什么么?你不知道!

同时你的程序也可以用这个变量引用一个机器人程序对象实例,它的“程序生成器”方面的特性也被调动起来了。但是我和它虽然在“程序生成器”方面接口相同,但是显然必定有些功能的内部实现是完全不同的。但是你的代码无需修改任何东西,你只要知道要用这个变量引用该引用的个体,就能用同一个程序得到不同的结果。
子夜__ 2011-02-27
  • 打赏
  • 举报
回复
我说“我是人”。这里,我既可能是人,但是在医院护士眼里则只是一个“患者”
  • 打赏
  • 举报
回复
我说“我是人”。这里,我既可能是人,但是在医院护士眼里则只是一个“患者”,在父母眼里则只是一个“孩子”,等等。但是我还是我,不会因为在不同人眼里我有不同的类型,于是我就分身了。

因此你声明一个“人类”类型的变量,它可以引用任何具有“人类”特性的个体,同时你还可以声明另外一个“程序生成器”的类型的变量,这两个变量都引用我。

所以一定要记住,真正起作用的是个体,而类型只是一种在个体上面“贴标签”的手段。如果你认为任何东西都应该先分类,然后再细分,最后才是落实到个体,这就是做八股文章了。个体对象才是最实在的、独一无二的。而对象之所以有类型,纯粹是为了编程设计的需要。

把上面这个观点反过来看,就可以看到多态的作用。进入医院住院,医院就按照对待病人的操作规定来对待我。医院它可不是一个对待什么空洞的“人类”的地方,而是对待患者进行处置的地方。那么我也就要把自己作为一个患者来应对医院,我也不是以为自己仅仅是一个空洞的“人类”而忘记了作为具体身份的人时应该做出的具体行为。
  • 打赏
  • 举报
回复
[Quote=引用楼主 winlerman 的回复:]
大家好,我是C#的初学者。
请问通过父类引用子类,从而来使用子类override方法,有什么实际用处。
(不通过父类引用子类,而直接通过子类的对象来调用该方法不是也可以实现吗?为什么要这么麻烦呢)

谢谢大家。
[/Quote]

“通过父类引用子类”?这是典型的误区。

你声明一个变量的类型是父类,这只是声明,这时候没有什么子类概念。而当你实例化一个子类实例,然后赋值给这个变量,这不是什么“引用子类”,因为这时候是考虑具体的对象,而不是考虑类型。

打个比方,你我都是人。其中我还是好男人。那么我说“我是人”,难道是通过“人类来引用好男人”?如果把这个话(“通过人类来引用好男人”)直接拿给普通人说,肯定不知所云。不能被普通人理解的语言就有严重的问题。
zengbin3013 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lanlang_88 的回复:]
个人认为,在父类作为参数时最为明显。比如:
class A{
public virtual void t(){}
}
class B:A{
public override void t(){}
}
class C:A{
public override void t(){}
}

class test{
//如果te方法的参数为子类类型,要对子类进行重载
……
[/Quote]

学习了
threenewbee 2011-02-26
  • 打赏
  • 举报
回复
一个典型的应用是取代观察者模式的事件处理代码,比如:
class Control
{
public virtual void OnClick() { }
public virtual void OnPaint() { }
private void MessageHandler(Message msg)
{
if (msg == Message.ClickMsg) OnClick();
if (msg == Message.PaintMsg) OnPaint();
}

}

class MyControl : Control
{
public override void OnClick()
{
MessageBox.Show("the control was clicked!");
}
}
詸菲貓 2011-02-26
  • 打赏
  • 举报
回复
个人认为,在父类作为参数时最为明显。比如:
class A{
public virtual void t(){}
}
class B:A{
public override void t(){}
}
class C:A{
public override void t(){}
}

class test{
//如果te方法的参数为子类类型,要对子类进行重载
public void te(B b){
b.t();
}
public void te(C c){
c.t();
}
//而如果参数为父类类型,则只需要写成,而在调用te方法时可以直接给任一子类的参数
public void te(A a){
a.t();
}
}
这里是子类比较少的情况,比较并不明显,但是假如说你想再添加D,E,F,G....个子类,如果写成第一种格式,就要对代码进行大幅度的改动,而写成第二种格式就不需要改动代码,所以通过父类引用子类可以增加代码的重用性,并且易于代码的维护和改动。
wuyq11 2011-02-26
  • 打赏
  • 举报
回复
子类使用new关键字屏蔽父类的方法,调用谁的方法由“定义时的类型决定”;
子类使用override关键字重写父类方法,调用谁的方法由”运行时引用真实的对象决定“。
class A { }
class B : A { }
class Test
{
public Test()
{
A a= new B() as A;
}
}
hztltgg 2011-02-26
  • 打赏
  • 举报
回复
这样可以在你调用这个子类方法的代码里可以不考虑具体的类型了

比如,一个形状类,三角形,正方形,圆形,有计算面积的方法,每个子类不同,override过了

你有很多具体的三角形,正方形,圆形对象,就可以放在一个形状类的集合或者数组中,循环的调用这个形状的计算方法就可以自动实现调用不同的方法了
小D2013 2011-02-26
  • 打赏
  • 举报
回复
这个要用到多肽才有好处,即子类重写父类的虚方法,

110,533

社区成员

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

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

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