V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
version0
V2EX  ›  程序员

关于 Dart 的重定向构造函数的疑问

  •  
  •   version0 · 2020-01-12 15:05:08 +08:00 · 2251 次点击
    这是一个创建于 1778 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上代码

    class Point extends Test {
      num x;
      num y;
      num z;
      num get a {
        return this.x + this.y;
      }
    
      set a(num v) {
        x = v - y;
      }
    
      Point.fromJson(Map jsonMap)
          : this.x = jsonMap['x'],
            y = jsonMap['y'],
            super.fromJson({}) {
        print(this.x);
        print('In Point.fromJson(): ($x, $y, $z)');
      }
    
      Point.aliasB(Map jsonMap, num z)
          : this.z = z,
            super.fromJson({}) {
        Point.fromJson(jsonMap);
      }
    
      Point(Map jsonMap, this.z) : super(jsonMap) {
        print('In Point(): ($x, $y, $z)');
        x = jsonMap['x'];
        y = jsonMap['y'];
        print('In Point(): ($x, $y, $z)');
      }
    }
    
    class Test {
      num x;
      num y;
      Test(Map map)
          : x = map['x'],
            y = map['y'] {
        print('In Parent.Test(): ($x, $y)');
      }
      Test.fromJson(Map map) : this(map);
    }
    
    main(List<String> args) {
      new Point({'x': 1, 'y': 2}, 3);
      new Test({'x': 1, 'y': 2});
    }
    
    

    执行结果

    In Parent.Test(): (null, null)
    In Point(): (null, null, 3)
    In Point(): (1, 2, 3)
    In Parent.Test(): (1, 2)
    

    疑问:

    1:Test 构造函数冒号右边不是赋值了吗 为啥是 null ?接受的参数打印出来是有值的

    2:如果我把 Test 类的成员变量 x,y 改名字不跟子类一样,就能打印出来,这又是为啥?

    希望有大佬能解答一下菜鸟的疑问

    5 条回复    2020-01-14 15:30:21 +08:00
    IGJacklove
        1
    IGJacklove  
       2020-01-12 18:24:25 +08:00
    父类和子类都有相同名字的参数,Point 的 x 就是他自己的 x,如果想访问父类 Test 的 x,用 super.x
    version0
        2
    version0  
    OP
       2020-01-12 22:40:33 +08:00
    @IGJacklove 额,你说的我知道啊,但是没解决我的问题啊,Test 类的构造方法没有给它的属性 x,y 赋值呢,是因为子类调用父类的构造方法时,不会执行父类构造方法 冒号后面的赋值语句吗?我把赋值语句放到{}里就能赋值
    bytelee
        3
    bytelee  
       2020-01-13 09:22:18 +08:00
    这样看 Point 初始化的时候 父类的 Test 的初始化里边打印的应该是 point.x point.y 所以没有赋值。
    version0
        4
    version0  
    OP
       2020-01-14 13:55:42 +08:00
    @bytelee 我给 Point 的 x、y 设置默认值后来看 确实是这样的,那是不是父类和子类变量同名的清空下,在父类的构造方法里没法访问它本身的变量了?如果能,该咋访问(加 this 还是访问的子类的)。
    bytelee
        5
    bytelee  
       2020-01-14 15:30:21 +08:00
    @version0 #4 那个里边的 this 应该也是子类的了 我其实感觉应该避免这种做法😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   924 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:12 · PVG 06:12 · LAX 14:12 · JFK 17:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.