2011-03-29 27 views
13

Scala'da şöyle bir şey yazabilir:Scala'daki bir üyeye nasıl yetki verebilirim?

trait Road { 
    ... 
} 

class BridgeCauseway extends Road { 
    // implements method in Road 
} 

class Bridge extends Road { 
    val roadway = new BridgeCauseway() 

    // delegate all Bridge methods to the `roadway` member 
} 

veya Road yöntemlerinin her birini tek tek uygulamalı mıyım ve roadway'de ilgili yöntemi çağırmalı mıyım?

+6

Bkz Kevin Wright'ın otomatik vekil derleyici eklentisi. –

+4

@daniel - İlginç olduğunu söylemeliyim, kısa bir süre önce bunu tekrardan açtım. 2.9 derleyicisinin orijinal tasarımımı destekleyebilecek değişiklikler var. –

+0

@kevin - harika! Herkesin bu proxy işlevine ihtiyacı olduğunu düşünüyorum. kesinlikle standart bir scala özelliği olmalı! Ben her zaman, ben derleyici-eklenti yükleme tembel olduğumu nedeni tam olarak budur - ben bunu yazarak, daha sonra şeffaf bir şekilde kullanmak için sbt, fikir vb pp ikna etmek gerekir. Sunum derleyicisi ile çalışır (örneğin, fikir)? –

cevap

14

Bunu gerçekleştirmek için en kolay yolu yerine sınıf uzantısı örtük dönüşüm olduğunu Bridge'u Road koleksiyonuna kaydeder. Eğer tekrar Bridge almak gerekir yoksa

, sen bir Any döndürür Road bir owner yöntemi ekleyin BridgeCauseway için bir yapıcı parametresi kullanılarak ayarlayın ve ardından kalıp maç Köprüyüele almak edebilirsiniz:

trait Road { 
    def owner: Any 
    ... 
} 

class BridgeCauseway(val owner: Bridge) extends Road { . . . } 

class Bridge extends Road { 
    val roadway = new BridgeCauseway(this) 
    ... 
} 

myBridgeCauseway.owner match { 
    case b: Bridge => // Do bridge-specific stuff 
    ... 
} 
+0

Neden Bridge'in nesne arkadaşı içinde örtük koymuyorsunuz? Bu otomatik ileriyi sağlayacaktır. Tabii ki, yöntemler yan etkili ise, istenildiği gibi çalışmayabilir. –

+0

@Daniel - Bir arkadaşım olmadığı için yapmadım. Ama ben katılıyorum, '' Köprü {...} 'içindeki nesnenin içine konulması, normalde ne isteyebilir. –

+0

Çocuğun child.parent ile değiştirilebileceğini biliyorum, ancak child.parent.parent ile çocuğu değiştirmek için implikasyonları kullanmanın bir yolu var mı? –

3

Bridgetrait yapabilirsiniz.

scala> trait A { 
    | val x: String 
    | } 
defined trait A 

scala> class B extends A { 
    | val x = "foo" 
    | val y = "bar" 
    | } 
defined class B 

scala> trait C extends A { self: B =>   
    | val z = "baz"    
    | } 
defined trait C 

scala> new B with C 
res51: B with C = [email protected] 

scala> res51.x 
res52: java.lang.String = foo 

scala> res51.y 
res53: java.lang.String = bar 

scala> res51.z 
res54: java.lang.String = baz 
İlgili konular