作者shishe (贾富贵)
站内C_Sharp
标题Re: [问题]子类对象赋值给父类对象,父类对象能使ꔠ…
时间Sat Feb 12 21:25:57 2011
谢谢我文章几位大大的回答,包括给定地址的文章我也看了。
这两天看得比较多些的书,其实我觉得自己比较明白了,我认为其实是这样的:
(1)在c#中,实例其实并不确定是哪一个类的,当然你用new声明为一个实例的时候,
这个实例就是你那个类的,但如果你用我举例得那个方法,使用“=”的方式把这个实例
与另一个类(例如父类)联系起来,连名称也可重新声明,则有时候又可以将这个实例
当作另一个类(例如父类)的实例来用,虽然这个实例的名称变了,可使用的属性和方
法也变了一些,例如子类特有的属性、方法不能访问了,但这个变了名称的实例实际上
还是原来那个子类的实例,并没有多出一个新实例,看起来有一个子类一个父类两个实
例,实际上还是只有那一个。
(2)就我现在看的书,不知道这样认为对不对:其实只有当用new声明一个实例的时候
,才是“创造”一个实例,上面我所说的方法,并没有创造一个实例。就好像只有一辆
宝马车x,当我造出(new)它来的时候,我是把它当作小汽车类的一辆汽车x,但我又可
以把它当作(=的方法)父类-交通工具的一个现成的交通工具,并可以把它叫做交通工
具y,不论是x、还是y,实际是一个东西,不是两个。
※ 引述《shishe (贾富贵)》之铭言:
: 代码如下:
: 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:→ andymai:接下来可以看看"深入浅出-设计模式"这本书~会在里面看到更 02/12 22:45
2F:→ andymai:具变化、更棒的应用,都是前人智慧的结晶,不过也要小心不 02/12 22:46
3F:→ andymai:要走火入魔就是了XD 02/12 22:46