Ketiga bentuk tersebut valid, dan memiliki efek yang B
dianggap sebagai jenis this
dalam kelas A
.
Dua varian pertama
trait A { self: B => ... }
trait A { foo: B => ... }
perkenalkan self
(masing-masing, foo
) sebagai alias untuk this
in trait A
. Ini berguna untuk mengakses this
referensi dari kelas dalam. Yaitu, Anda kemudian dapat menggunakan self
alih-alih A.this
saat mengakses this
referensi sifat A
dari kelas yang bersarang di dalamnya. Contoh:
class MyFrame extends JFrame { frame =>
getContentPane().add( new JButton( "Hide" ) {
addActionListener( new ActionListener {
def actionPerformed( e: ActionEvent ) {
frame.setVisible( false )
}
})
})
}
Varian ketiga,
trait A { this: B => ... }
tidak memperkenalkan alias untuk this
; itu hanya mengatur tipe diri.
trait A { self: B, C => ... }
?with
kata kunci dalam anotasi pengetikan sendiri. Misalnyatrait A { self: B with C => ... }
_: B =>
untukAda perbedaan yang
this
selalu mengacu pada objek yang didefinisikan oleh template terdalam.Jadi, jika Anda menyebut tipe-diri
foo
Anda, Anda masih bisa merujuknya sebagaithis
(kecuali, tentu saja, Anda berada di templat bagian dalam yang dalam hal inithis
akan merujuk ke objek yang ditentukan olehnya - dan kecuali Anda tidak memberikan bagian dalam template mengetik sendiri nama yang sama) tetapi jelas bukan sebaliknya.sumber