none
利用this和base访问基类成员的疑问 RRS feed

  • 问题

  • class Program
        {
            static void Main(string[] args)
            {
    
                Car car = new Car();
                car.ShowOwner();
    
            }
        }
        class Vehicle
        {
            public Vehicle()
            {
                this.Owner = "N/A";
            }
            public string Owner { get; set; }
    
        }
        class Car:Vehicle
        {
            public Car()
            {
                this.Owner = "Car Owner";
            }
            public void ShowOwner()
            {
                Console.WriteLine( base.Owner);
            }
        }

       以上程序时我在学习时遇到的一个实例代码

    我的疑问是:

    在调用Car这个是实例的方法成员 public void ShowOwner(),程序使用的是(Console.WriteLine(base.Owner);)这里面base关键字我查了一下是调用基类的成员,按照我的理解这里应该打印出 "N/A",可是我动手验证了一下打印出来的却是"Car Owner" 如果这里使用“this”我是能理解的,因为this就代表这个实例的本身

    可是为什么用base 打印出来的不是"N/A"而是"Car Owner" 

    谢谢

    2018年11月21日 4:39

全部回复

  • 可是为什么用base 打印出来的不是"N/A"而是"Car Owner" :

    Car的构造函数中对Owner属性赋值了:"Car Owner",

    Owner属性继承与父类的Vehicle,父类的Owner属性被赋值为"Car Owner"

    所以,当调用base.Owner, 输出就是"Car Owner"


    ericzhou

    2018年11月21日 5:19
  • 谢谢

    父类的Owner属性在哪里被赋值成"Car Owner"?

    当调用父类的构造函数,不还是把“N/A”赋值给了父类的Owner属性了吗

    2018年11月21日 6:51
  • 父类的Owner属性在哪里被赋值成"Car Owner"?

    当调用父类的构造函数,不还是把“N/A”赋值给了父类的Owner属性了吗

    其实没有调用父类的构造函数,除非改一下代码:

    class Car:Vehicle
        {
            public Car():base()
            {
                this.Owner = "Car Owner";
            }
            public void ShowOwner()
            {
                Console.WriteLine( base.Owner);
            }
        }


    ericzhou

    2018年11月21日 8:37
  • 你好,

    因为只新建了一个Car 对象,只有一个Owner属性,在子类的构造函数中重写这个属性的值, 你可以在父类和子类的构造函数分别打上断点,看看执行顺序, 再在Watch 窗口中监测父类和子类的Owner属性值。

    Best regards,

    Zhanglong


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年11月21日 8:58
    版主
  • 你只需要弄清楚一下两点:

    1、Car 里面的Owner 成员 是从父类Vehicle 继承过来的公有成员。所以base.Owner 和 this.Owner都是同一个变量

    2、在子类的构造函数调用时,会先递归调用父类的构造函数,也就是在Car()的第一行会调用Vehicle(),调用玩Vehicle之后Owner 是"N/A", 然后回到Car()构造函数里继续执行,Owner又被修改为"Car Owner"

    上面两点理解了,你的问题就明白了

    2018年11月21日 13:08
  • class Car:Vehicle
        {
            public Car()
            {
    
                Console.WriteLine( base.Owner);//这里是没赋值前的
                this.Owner = "Car Owner";
            }
            public void ShowOwner()
            {
                Console.WriteLine( base.Owner);
            }
        }

    这样对比一下,能更好的理解了。

    family as water

    2018年11月22日 1:24
  • 谢谢

    执行顺序是,在调用Car的构造函数前,先调用了Vehicle构造函数,

    调用Vehicle构造函数后,Owner属性被赋值成 "N/A"

    然后调用了Car的构造函数,Owner属性被赋值成"Car Owner"

    再次请教一下:

    当在子类 Car中调用了它的基类构造函数 Vehicle 之后,就会产生一个Vehicle类型的实例(在实例化子类之前必须先实例化它的父类),只是没有引用变量引用它,这句话对吗?

    如果在上个问题是正确情况下,在调用完Car的构造函数后,应该也会产生一个Car类型的实例,Car从它的父类继承了 Owner 这个属性

    那么我想问:

    Car里面Owner属性,和由Vehile构造函数生成那个没有引用变量引用的实例的 Owner属性 它们在内存中地址相同?还是两个不相同的属性?

    当子类从父类继承类成员的时候,是将父类 类成员复制一份给自己,还是仅仅是引用父类成员?

    2018年11月22日 2:06
  • 谢谢

    执行顺序是,在调用Car的构造函数前,先调用了Vehicle构造函数,

    调用Vehicle构造函数后,Owner属性被赋值成 "N/A"

    然后调用了Car的构造函数,Owner属性被赋值成"Car Owner"

    再次请教一下:

    当在子类 Car中调用了它的基类构造函数 Vehicle 之后,就会产生一个Vehicle类型的实例(在实例化子类之前必须先实例化它的父类),只是没有引用变量引用它,这句话对吗?

    如果在上个问题是正确情况下,在调用完Car的构造函数后,应该也会产生一个Car类型的实例,Car从它的父类继承了 Owner 这个属性

    那么我想问:

    Car里面Owner属性,和由Vehile构造函数生成那个没有引用变量引用的实例的 Owner属性 它们在内存中地址相同?还是两个不相同的属性?

    当子类从父类继承类成员的时候,是将父类 类成员复制一份给自己,还是仅仅是引用父类成员?

    2018年11月22日 2:07
  • 谢谢

    执行顺序是,在调用Car的构造函数前,先调用了Vehicle构造函数,

    调用Vehicle构造函数后,Owner属性被赋值成 "N/A"

    然后调用了Car的构造函数,Owner属性被赋值成"Car Owner"

    再次请教一下:

    当在子类 Car中调用了它的基类构造函数 Vehicle 之后,就会产生一个Vehicle类型的实例(在实例化子类之前必须先实例化它的父类),只是没有引用变量引用它,这句话对吗?

    如果在上个问题是正确情况下,在调用完Car的构造函数后,应该也会产生一个Car类型的实例,Car从它的父类继承了 Owner 这个属性

    那么我想问:

    Car里面Owner属性,和由Vehile构造函数生成那个没有引用变量引用的实例的 Owner属性 它们在内存中地址相同?还是两个不相同的属性?

    当子类从父类继承类成员的时候,是将父类 类成员复制一份给自己,还是仅仅是引用父类成员?

    2018年11月22日 2:07
  • Car里面Owner属性,和由Vehile构造函数生成那个没有引用变量引用的实例的 Owner属性 它们在内存中地址相同?还是两个不相同的属性?

    一个属性,一个地址

    当子类从父类继承类成员的时候,是将父类 类成员复制一份给自己,还是仅仅是引用父类成员

    继承复制一份属性


    ericzhou

    2018年11月22日 3:04