oop - Rust 等同于 C++ 的虚函数是什么?

标签 oop rust traits

我试图在 Rust 中实现一些像类中的 C++ 虚函数一样工作的东西,我会有一个包含数据的基本结构,然后我会保留一些未定义的函数,如下例所示:

class A {
    int stuff;
public:
    virtual void foo(int a, int b) = 0;
    void function_that_calls_foo() { /*...*/ foo(1, 2); /*...*/ }
}

class B: public A { void foo(int a, int b) { /* ... */ } }

我曾尝试使用函数指针来实现它,但没有取得太大成功。我可以将特征与 A 的函数一起使用,并在另一个类上实现 A,但我会丢失结构的数据。在 Rust 中实现这种东西的最佳(最快?)方法是什么?

struct A {
    ...
}

impl A {
    fn function_that_calls_foo(&self) {
        ...
        self.foo(a, b);
        ...
    }
}

struct B {
    a: A;
}

impl B {
    fn xxx(&self) {
        a.function_that_calls_foo(1, 2);
    }

    fn foo(&self, a: i32, b: i32) {...}
}

最佳答案

keep some functions undefined

我正在添加隐含的“并且有一些函数调用那个待定义的函数”。

作为E_net4 says , 使用 trait :

trait Foo {
    fn foo(&self, a: i32, b: i32) -> i32;

    fn function_that_calls_foo(&self) {
        println!("{}", self.foo(1, 2));
    }
}

然后您可以为 Base 实现特征:

struct Base {
    stuff: i32,
}

impl Foo for Base {
    fn foo(&self, a: i32, b: i32) -> i32 {
        self.stuff + a + b
    }
}

作为Matthieu M. says , Rust 没有继承,所以使用组合:

struct Base {
    stuff: i32,
}

impl Base {
    fn reusable(&self) -> i32 {
        self.stuff + 1
    }
}

struct Alpha {
    base: Base,
    modifier: i32,
}

impl Foo for Alpha {
    fn foo(&self, a: i32, b: i32) -> i32 {
        (self.base.reusable() + a + b) * self.modifier
    }
}

您也可以通过使用 generic 来结合这两个概念。受类型参数约束。


我会强烈支持 Dietrich Epp's point .使用新语言应该涉及检查新范例。以代码重用为目的的继承通常不是一个好主意,即使在支持它的语言中也是如此。相反,创建更小的构建 block 并将它们组合在一起。

关于oop - Rust 等同于 C++ 的虚函数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44783925/

相关文章:

javascript - 使用 popcorn.js 迭代 cue 方法

Python 类/对象 __str__ 和其他问题

c++ - '{' token c++ 继承问题之前的另一个预期类名

rust - 创建后如何更改 PistonWindow 的分辨率?

rust - 在等待读取时处理写入 TcpStream 的惯用方法

rust - 如何为我不拥有的类型实现我不拥有的特征?

C#继承问题

rust - 如何从特征对象中获取对具体类型的引用?

syntax - 如何定义带有参数和返回类型(如 Fn)的特征?

generics - 使用静态分派(dispatch)返回特征类型