当前位置: 首页 > 知识库问答 >
问题:

什么是等价于C语言虚函数的Rust?

伏德义
2023-03-14

我试图在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的函数中使用trait,并在另一个类中实现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) {...}
}

共有1个答案

柯骏
2023-03-14

保持某些函数未定义

我正在添加隐式的“并有一些调用该待定义函数的函数”。

正如E_net4所说,使用trait:

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

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

然后,您可以为< code>Base实现trait:

struct Base {
    stuff: i32,
}

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

正如Matthieu M.所说,锈菌没有遗传性,所以使用组合:

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

通过采用受类型参数约束的泛型,也可以组合这两个概念。

我强烈支持迪特里希·埃普的观点。使用一种新的语言应该包括检查新的范例。为了代码重用而继承通常不是一个好主意,即使在支持它的语言中也是如此。相反,创建较小的构建块并将它们组合在一起。

 类似资料:
  • 在Python中有没有我可以做的等价操作?

  • 问题内容: 在C ++中,从构造函数内部调用虚拟函数时,它的行为不像虚拟函数。 我认为第一次遇到这种行为的每个人都会感到惊讶,但第二次认为这是有道理的: 只要派生的构造函数没有被执行的对象是 不是 又一个 衍生 实例。 那么如何调用派生函数呢?前提条件还没有建立的机会。例: Java和.NET完全相同,但是他们选择了另一种方式,这可能是 产生最少惊讶原则 的唯一原因吗? 您认为哪个是正确的选择?

  • 本文向大家介绍什么是虚函数?什么是抽象函数?相关面试题,主要包含被问及什么是虚函数?什么是抽象函数?时的应答技巧和注意事项,需要的朋友参考一下 答: 虚函数:没有实现的,可由子类继承并重写的函数。Virtual CallSomeOne(); 抽象函数:规定其非虚子类必须实现的函数,必须被重写。public abstract void CallSomeOne();  

  • 问题内容: 这个问题可能背叛了一个误解,但是我很好奇Python世界的“ Tomcat”是什么。 我所有的Web编程经验都是Java(或Groovy),因此我认为是Java。当我想到制作一个基本的Web应用程序时,我想到了编写一些servlet,构建WAR文件并将其部署在Tomcat或另一个servlet容器中。 在Python中,假设我编写了一些能够响应HTTP请求的代码,我该怎么办?我将如何部

  • 本文向大家介绍什么是C语言的字谜?,包括了什么是C语言的字谜?的使用技巧和注意事项,需要的朋友参考一下 字谜字符串只不过是在另一个字符串中出现相同次数的所有字符,我们称之为字谜。 用户输入两个字符串。我们需要计算每个字母(“ a”至“ z”)出现在其中的次数,然后比较它们相应的计数。字符串中字母的出现频率是它出现在其中的次数。 如果两个字符串对特定字母的频率计数相同,那么我们可以说这两个字符串是字

  • 用C语言完全模拟C++虚函数表的实现与运作方式 如果对前面两大节的描述仔细了解了的话,想用C语言来模拟C++的虚函数以及多态,想必是轻而易举的事情了! 前提 但是,话得说在前面,C++的编译器在生成类及对象的时候,帮助我们完成了很多事件,比如生成虚函数表! 但是,C语言编译器却没有,因此,很多事件我们必须手动来完成,包括但不限于: 手动构造父子关系 手动创建虚函数表 手动设置__vfptr并指向虚