2015-11-22 15 views
5

Kotlin, visibility modifiers'un yanı sıra extension functions'un bir çift özelliklerini barındırır. Belgeleme, Extensions are resolved statically. Fakat bu, sınıf üyelerinin uzatma fonksiyonları içindeki görünürlüğü için ne anlama geliyor? Korumalı üyeler genişletme işlevlerine erişemez mi?

en aşağıdaki yapmacık örneğini ele alalım:

class A { protected val a = "Foo" } 
fun A.ext() { print(a) } //Raises: Cannot access 'a': it is 'protected' in 'A' 

class B { val b = "Bar" } 
fun B.ext() { print(b) } //Compiles successful 

kod derlemek olmaz. Sınıfı genişletirken korunan üyelere ulaşılamıyor gibi görünüyor.

Yani uzatma fonksiyonu Java böyle bir şey olması için sözdizimsel şeker anlamına statik çözüldü yapar: korumalı üyeler erişilebilir değildir açıklıyor

public static void ext(A receiver){ System.out.print(receiver.a); } 

. Diğer yandan, uzatma fonksiyonlarında this'u kullanmak (ve hatta atmak) mümkündür.

Uzantı işlevlerinin tam kapsamı nedir?

cevap

6

Doğru, uzatma işlevleri/özellikleri statik JVM yöntemleri için derlenmiş. Genelde, başka bir sınıfta, genişletildikleri sınıftan başka bir sınıfta yer alırlar, bu nedenle VM erişilebilirlik kuralları nedeniyle bu sınıfın korunan yöntemlerini çağırmak mümkün değildir. Ayrıca protected görünürlük definition (sınıfta ve alt sınıflarında görünür) ile de tutarlıdır: bir genişletme işlevi bir alt sınıf değil, genişletmekte olduğunuz sınıfın bir alt sınıfında tanımlanmamıştır.

Bir uzantı işlevinin gövdesinde this kullanıp atlamanız gerçeği yalnızca sözdizimsel bir özelliktir, derleyici bunun yerine JVM yönteminin ilk parametresini yüklemek için gerekli yönergeleri yayar.