Lebih mudah untuk memahami mengapa Anda tidak dapat melakukan itu jika Anda melihat javascript kode Anda yang telah dikompilasi:
var OuterClass = (function () {
function OuterClass() {
this.outerField = 1337;
this.InnerClass = (function () {
function class_1() {
}
class_1.prototype.accessOuter = function () {
return this.outerField; // outerField not defined
};
return class_1;
}());
}
return OuterClass;
}());
Seperti yang Anda lihat, outerField
didefinisikan sebagai anggota OuterClass
seperti:
this.outerField = 1337;
Saat Anda mencoba mengaksesnya di InnerClass
, Anda melakukan:
return this.outerField;
Namun this
di sini adalah turunan dari class_1
dan bukan OuterClass
jadi tidak ada outerField
di this
.
Selain itu, Anda tidak memiliki akses dari kelas dalam ke turunan kelas luar.
Cara penyelesaiannya di java adalah seperti ini:
class OuterClass {
private int outerField = 1337;
public class InnerClass {
public int accessOuter() {
return OuterClass.this.outerField;
}
}
}
Namun tidak ada yang setara dengan OuterClass.this.outerField
dalam skrip ketikan/javascript.
Lihatlah kelas dalam skrip ketikan lebih mirip kelas dalam statis di java, namun di sini juga Anda hanya dapat mengakses properti publik:
class OuterClass {
public static outerField = 1337; // has to be public
public InnerClass = class {
public accessOuter() {
return OuterClass.outerField;
}
}
}
Anda dapat meneruskan sebuah instance dari kelas luar ke kelas dalam:
class OuterClass {
public outerField = 1337;
public InnerClass = class {
constructor(private parent: OuterClass) {}
public accessOuter() {
return this.parent.outerField;
}
}
}
Namun sekali lagi, Anda harus memiliki outerField
publik.
Sunting
Jika Anda ingin mencapai sesuatu yang akan mensimulasikan perilaku yang diperlukan (yaitu, instance kelas dalam akan memiliki akses ke anggota kelas luar privat), maka Anda dapat melakukan sesuatu seperti ini:
interface OuterClassProxy {
outerField: number;
}
interface IInnerClass {}
class OuterClass {
private outerField = 1337;
static InnerClass = class implements IInnerClass {
constructor(private parent: OuterClassProxy) {}
public accessOuter() {
return this.parent.outerField;
}
}
public createInnerClass(): IInnerClass {
let outerClassInstance = this;
return new OuterClass.InnerClass({
get outerField(): number {
return outerClassInstance.outerField;
},
set outerField(value: number) {
outerClassInstance.outerField = value;
}
});
}
}
Ini pekerjaan yang cukup banyak, tapi itu akan berhasil.
person
Nitzan Tomer
schedule
03.08.2016