Dart中使用super初始化构造函数时可省略父类私有成员下划线的原因
Dart中使用super初始化构造函数时可省略父类私有成员下划线的原因
嘿,这个问题问得特别好,我当初刚学Dart的时候也被这个语法糖搞懵过,来给你拆解清楚~
首先得明确一个核心:你在子类里写的super.i不是直接访问父类的私有成员_i,这是Dart专门为构造函数初始化设计的语法糖!
咱们一步步拆解:
先看父类的构造函数
X(this._i)——这是Dart的简写语法,等价于:class X { final int _i; X(int _i) : _i = _i; }这里父类构造函数的参数是
_i,用来初始化同名的私有成员。当你在子类里写
Y(super.i)的时候,Dart编译器会自动识别:你是要把这个参数传递给父类的构造函数,而且这个参数对应的是父类用来初始化_i的那个构造参数。这时候Dart允许你用不带下划线的i来指代,本质上是编译器帮你做了映射,把super.i对应到父类构造函数的_i参数上。
那为什么父类自己写X(this.i)会报错呢?
很简单,父类的成员只有_i,没有i啊!父类里直接写this.i的话,编译器找不到这个成员,自然就报错了。但子类的super.i是在构造函数初始化的特殊上下文里,属于语法糖的特殊处理,不是直接访问成员,所以完全没问题。
还有个关键点:如果父类和子类不在同一个库,你本来是不能直接访问父类的_i私有成员的,但这个语法糖允许你通过super.i来传递参数给父类构造函数,完美绕过了私有成员的访问限制,同时又符合封装的原则——你并没有直接操作父类的私有成员,只是给父类的构造函数传参而已。
备注:内容来源于stack exchange,提问作者Vinci
相关产品推荐
相关产品推荐

