代码之家  ›  专栏  ›  技术社区  ›  iDecode

参数列表和初始化器列表中赋值的区别

  •  0
  • iDecode  · 技术社区  · 5 年前
    class A {
      A(int value);
    }
    
    class B extends A{
      final int foo;
    
      B.one(this.foo) : super(foo); // Works
    
      B.two(int foo) : foo = foo, super(this.foo); // Doesn't work
    }
    

    B.one ,我可以轻松地传递 foo super B.two ,我不能那样做。在这两种情况下 在调用之前分配 超级的 ,在一种情况下有效,在另一种情况下失败。所以,问题是在构造函数中创建字段的时间点。

    0 回复  |  直到 5 年前
        1
  •  2
  •   jamesdlin    4 年前

    Dart分两个阶段构造对象:第一阶段由外到内,然后由内到外。

    this 存在。(这就是为什么你不能使用 在初始化列表中;它还不存在。)(从技术上讲,直接成员初始化发生在初始化列表之前,但为了简单起见,我将它们集中在一起。)

    构造函数体然后由内而外执行(从基类到派生类)。

    如果没有这种方法,DART构造函数体在执行虚拟函数(java方法)时不能保证安全性,或者必须禁止虚拟调度(C++方法)。

    另请参见: Virtual functions in constructors, why do languages differ?

        2
  •  0
  •   Josteve Adekanbi    5 年前

    this 或其属性 super .
    仅在实例方法或生成构造函数的上下文中定义。

    https://dart.dev/tools/diagnostic-messages#invalid_reference_to_this .

    class B extends A{
      final int foo;
    
      B.one(this.foo) : super(foo);
    
      B.two(int foo) : foo = foo, super(foo); 
    }
    

    B.one ,您正在传递给超级 foo 作为财产 但是在 B.two 从上的参数 two

    class A {
      A(int value) {
        print(value);
      }
    }
    
    class B extends A {
      final int foo;
    
      B.one(this.foo) : super(foo);
    
      B.two(int foo): foo = 5, super(foo);
    }
    
    main() {
     B b = B.two(100); //Prints 100;
     print(b.foo); //Prints 5
    }