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

2020-01-12 15:05:08 +08:00
 version0

上代码

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 改名字不跟子类一样,就能打印出来,这又是为啥?

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

2269 次点击
所在节点    程序员
5 条回复
IGJacklove
2020-01-12 18:24:25 +08:00
父类和子类都有相同名字的参数,Point 的 x 就是他自己的 x,如果想访问父类 Test 的 x,用 super.x
version0
2020-01-12 22:40:33 +08:00
@IGJacklove 额,你说的我知道啊,但是没解决我的问题啊,Test 类的构造方法没有给它的属性 x,y 赋值呢,是因为子类调用父类的构造方法时,不会执行父类构造方法 冒号后面的赋值语句吗?我把赋值语句放到{}里就能赋值
bytelee
2020-01-13 09:22:18 +08:00
这样看 Point 初始化的时候 父类的 Test 的初始化里边打印的应该是 point.x point.y 所以没有赋值。
version0
2020-01-14 13:55:42 +08:00
@bytelee 我给 Point 的 x、y 设置默认值后来看 确实是这样的,那是不是父类和子类变量同名的清空下,在父类的构造方法里没法访问它本身的变量了?如果能,该咋访问(加 this 还是访问的子类的)。
bytelee
2020-01-14 15:30:21 +08:00
@version0 #4 那个里边的 this 应该也是子类的了 我其实感觉应该避免这种做法😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/637255

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX