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

What is the difference between this two approaches ? Why one approach works while the other doesn't?

提问人:newlunch 提问时间:8/26/2023 最后编辑:Christopher Moorenewlunch 更新时间:8/27/2023 访问量:31

问:

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 字段传递给超类?这个解决方案根本无法回答我的问题。

飞镖 继承 这个

评论

0赞 derpirscher 8/26/2023
“B.two() 只是抛出一个错误。”介意分享什么错误?
0赞 newlunch 8/26/2023
错误:无法访问字段初始值设定项中的“this”。- 这是我的另一个担忧。我在文档中读到dart省略了使用此关键字。据我了解,B.one(this.x) : super(x) 中的 dart 省略了这个关键字,因为 super(x) 指的是 B 类的字段。但是当我尝试将此关键字插入此行时,编译器只会抛出一个与 B.two() 完全相同的错误(错误:无法在字段初始值设定项中访问“this”。
1赞 jamesdlin 8/27/2023
请参见 stackoverflow.com/a/63319094。 在调用基类构造函数之前根本不有效。this

答: 暂无答案