2013-09-07 13 views
10

Wie nennt Rust "Elternmethode"? Wie dies in Java:Rust Vererbung: Aufruf Eltern Methode

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."); 
    } 
} 

In Go, können wir sie durch anonyme Felder in struct simulieren:

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() 
} 

Wie es in Rust zu simulieren? Vielen Dank!

Antwort

12

Es ist nicht ganz dasselbe unter der Haube, aber so etwas wie

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(); 
} 

Es gibt ein paar Vorschläge für Teile dieser automatischen Herstellung (zB wenn wir die Eltern Methode direkt, dh don‘nur nennen wollte t überschreibt die Methode im Kind, dann muss man die Methode des Elternteils explizit selbst aufrufen).

+2

Ist dies immer noch der Weg, es zu tun oder haben ihre Updates? Entschuldigung, ich habe selbst gegoogelt, aber es ist schwer, aktuelle Informationen für Rust zu finden. –

+2

@JeroenBollen, ja, immer noch der Weg, es zu tun. – huon

+2

Das Problem dabei ist, dass es nicht für Struct-Felder funktioniert. Was ist zum Beispiel, wenn Sie ein Base-Struct-Feld in anderen Structs erneut verwenden möchten? 'struct Animal {Gesundheit: int; } struct Hund {fn bark() ->() {...}} "Wie erbt der Hund die Gesundheit von Tier? –

-2

Der Vererbungspunkt ist in der Lage, eine geerbte Methode zu überschreiben. Die oben genannten Beispiele betreffen immer noch die Delegierung und nicht die Vererbung.

Schauen wir uns einige Go-Code einen Blick dies zu verdeutlichen:

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") } 

Wenn Sie den Code über diese Weise laufen

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

wird es „foo Magie“ auf der Konsole gedruckt und nicht "Basismagie". Wenn wir jedoch diesen Code

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

laufen wird es nicht „foo Magie“ drucken, wie gut, aber dieses Mal „Basis Magie“. Dies liegt an der fehlenden Vererbung und somit an der Möglichkeit, die Methode Magic (auch Dynamic Linking genannt) zu überschreiben. Wir haben es also immer noch mit der Delegation zu tun.

Sie können dies umgehen z. wie im Abschnitt "Inner Patern" in this Artikel beschrieben. Ich weiß nicht genau, was Rust betrifft. Auf den ersten Blick scheint es dasselbe zu sein.

+0

Beachten Sie, dass dieses "Fehlen der Vererbung" auch eine Vererbung darstellt und tatsächlich einer der Hauptpunkte des auf Delegierung basierenden Objektmodells ist, das Go verwendet. – Lii

Verwandte Themen