作者shishe (贾富贵)
站内C_Sharp
标题[问题]子类对象赋值给父类对象,父类对象能使用仅子类所有的成员?
时间Wed Feb 2 07:10:06 2011
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ch09Ex01
{
public class MyBase
{
public int a = 4;
public virtual int fangfa()
{
return a;
}
}
public class MyClass : MyBase
{
public int b = 100;
public override int fangfa()
{
return a + b;
}
}
class Program
{
static void Main(string[] args)
{
MyClass shiyan1 = new MyClass();
MyBase shiyan2 = shiyan1;
Console.WriteLine(shiyan2.fangfa());
Console.ReadKey();
}
}
}
结果是显示104,也就是说定义父类时所定义的虚拟方法在定义子类时被重写,使该方法
使用到仅仅子类所有的成员。这样当一个子类实例将自己赋给父类实例的时候,父类实
例的原虚拟方法将被替换,而且该方法将能使用子类的成员。
如上例所示,父类实例shiyan2根本没有变量b,但他的方法fangfa()却能调用变量b,是
不是这样?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 221.5.86.3
1F:推 horngsh:你说的正是OO里面的多型(同名异式-Polymorphism) 02/02 09:32
2F:→ andymai:这跟多型是不一样的意思吧...多型是相同的方法却设计不同 02/02 11:06
3F:→ andymai:的传入参数~原po也写错了~Main里面写的子类实例是当成父类 02/02 11:09
4F:→ andymai:用~而不是将自己赋给父类"实例"~就像是老爸和小孩各有"扫 02/02 11:11
5F:→ andymai:地"的方法~老妈(Main)叫的是老爸(MyBase)~但是动作的实体 02/02 11:12
6F:→ andymai:却是小孩(MyClass)~所以当然是用小孩的方法扫地~边扫边留 02/02 11:15
7F:→ andymai:垃圾(b)... 02/02 11:15
8F:推 horngsh:A大,多型有2种,1.静态多型(即method overloading) 02/02 12:30
9F:推 horngsh:2. Dynamic Binding 原作即是用动态系结 02/02 12:31
10F:推 horngsh:A大,原波是没弄懂Value Type and Reference Type的差别 02/02 13:00
11F:→ andymai:Sorry~我还真不知道Dynamic Binding算多型~书看太少了Orz 02/02 18:13