这两种方法有什么区别?为什么一种方法有效而另一种则无效?

问题描述 投票:0回答:1
class A {
  A(int value){
    print(value);
  }
}

class B extends A{
  int x;

  B.one(this.x) : super(x);

  B.two(int x) : this.x = x, super(this.x); 
}

我们这里有一个名为“B”的类,它继承自类“A”。 B 类有两个构造函数 - B.one() 和 B.two()。但只有 B.one() 可以正常工作,而 B.two() 只是抛出错误。问题是——为什么?在我看来, B.one() 的工作方式与 B.two() 完全相同 - B.one() 只是以更短的形式编写。问题是:dart 根本不允许我在 B.two() 中将值 this.x 传递给超类。但在 B.one() 中它让我!我在 A 类的参数中传递完全相同的变量,但只有 B.one() 让我这样做。这两个构造函数的工作到底有什么区别?

我遇到了这个解决方案:

class A {
  A(int value){
    print(value);
  }
}

class B extends A{
  int x;

  B.one(this.x) : super(x);

  B.two(int x) : this.x = x, super(x); 
}

只需从 B.two() 中删除此关键字 - 它就可以了。但现在它引用的不是 B 类字段中声明的变量 - 它传递给此构造函数中声明的超类变量。为什么我必须在 B.two() 中采用这种方法,但在 B.one() 中我可以将 x 字段传递给超类?该解决方案根本无法回答我的问题。

flutter dart inheritance this
1个回答
0
投票
B.two(int x) : this.x = x, super(this.x);

也许原因是在 this.x = x 初始化之前调用了超级构造函数,并且它试图访问未完全初始化的实例变量。

© www.soinside.com 2019 - 2024. All rights reserved.