13

Rust 如何调用“父方法”?像Java这样:</p>

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

在 Go 中,我们可以通过 struct 中的匿名字段来模拟它:

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

如何在 Rust 中模拟它?谢谢!

4

2 回答 2

16

它在引擎盖下并不完全相同,但类似于

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

有一些建议使这部分自动化(例如,如果我们只想直接调用父级的方法,即不要覆盖子级的方法,那么目前必须自己显式调用父级的方法)。

于 2013-09-07T14:45:56.380 回答
-1

继承的重点是能够覆盖继承的方法。上面提供的示例仍然处理委托而不是继承。

让我们看一些 Go 代码来说明这一点:

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

它会将“foo magic”打印到控制台而不是“base magic”。但是,如果我们运行这段代码

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

它也不会打印“foo magic”,但这次是“base magic”。这是因为缺少继承,因此无法覆盖 Magic 方法(也称为动态链接)。所以我们仍在处理代表团。

你可以解决这个 f.ex。如本文“内部模式”部分所述。关于 Rust,我并不完全了解这一点。乍一看似乎是一样的。

于 2014-04-24T08:46:08.073 回答