2013-09-07 30 views
10

Pas "ana yöntem" olarak nasıl adlandırılır? Java gibi: GitPas kalıtım: üst yöntemi çağırın

public class parent{ 
    ... 
    public void doSomething(){ 
     System.out.println("Parent method"); 
    } 
} 
public class child extends parent{ 
    ... 
    public void doSomething(){ 
     super.doSomething(); 
     System.out.println("Child method."); 
    } 
} 

, biz yapı içinde anonim alanlara göre taklit olabilir:

type parent struct{} 

func (self *parent) doSomething() { 
    fmt.Println("parent method") 
} 

type child struct { 
    parent 
} 

func (self *child) doSomething() { 
    self.parent.doSomething() 
    fmt.Println("child method") 
} 
func main() { 
    var c1 child 
    c1.doSomething() 
} 

Nasıl Rust bunu taklit etmek? Teşekkürler!

cevap

12

Bu başlık altında aynı değil, ama bir şey

trait DoThings { 
    fn do_something(&self); 
} 

struct Parent; 

impl DoThings for Parent { 
    fn do_something(&self) { println("doing something"); } 
} 

struct Child { 
    parent: Parent 
} 

impl DoThings for Child { 
    fn do_something(&self) { 
     self.parent.do_something(); 
     println("child"); 
    } 
} 

fn main() { 
    let c = Child { parent: Parent }; 
    c.do_something(); 
} 

gibi biz sadece, yani don' doğrudan ebeveynin yöntemini aramak istersem mesela (bu otomatik parçalarını yararlanmak için birkaç öneri vardır Çocukta yöntemi geçersiz kılmalı, daha sonra şu anda kişinin ebeveyninin kendi yöntemini açıkça çağırması gerekir).

+2

Bunu yapmanın ya da güncellemelerini almanın yolu hala bu mu? Üzgünüz, kendim Googled var ama Rust için güncel bilgi bulmak zor. –

+2

@JeroenBollen, evet, hala bunu yapmanın yolu. – huon

+2

Buradaki sorun, Yapı alanları için çalışmayacak olmasıdır. Örneğin, bazı diğer yapılarda bir baz yapı alanını yeniden kullanmak isterseniz ne olur? yapı Animal {health: int; } Dog Dog {fn bark() ->() {...}} Dog Dogun sagligini nasil kaldirir? –

-2

Kalıtım noktası, kalıtsal bir yöntemin üzerine yazabiliyor. Yukarıda verilen örnekler hala devralma ile değil devralma ile ilgilenmektedir.

en Bunu göstermek için bazı Git koda göz atalım: Bu şekilde yukarıdaki kodu çalıştırırsanız

type Base struct {} 
func (Base) Magic() { fmt.Print("base magic") } 
func (self Base) MoreMagic() { 
    self.Magic() 
} 

type Foo struct { 
    Base 
} 

func (Foo) Magic() { fmt.Print("foo magic") } 

f := new(Foo) 
f.Magic() 

o konsola "foo sihirli" yazdırmak ve olmayacak "üs büyüsü". Bu kodu

f := new(Foo) 
f.MoreMagic() 

çalıştırmak Ancak, buna da "foo sihirli", ama bu kez "baz sihirli" baskı olmayacaktır. Bu, kalıtımın eksikliğinden ve dolayısıyla Magic (aka dinamik bağlantı) yönteminin üzerine yazılmasından dolayıdır. Bu yüzden hala delegasyonla uğraşıyoruz.

Bu f.ex. this makalesinde "İç Patern" bölümünde açıklandığı gibi. Rust ile ilgili tam olarak bunu bilmiyorum. İlk bakışta aynı görünüyor.

+0

Bu "miras eksikliğinin" aynı zamanda mirastan bir özgürlük olduğunu ve aslında Go'nun kullandığı delegasyon temelli nesne modelinin ana noktalarından biri olduğunu unutmayın. – Lii