如何解决Rust无继承问题,令自定义类型可直接调用第三方类型公开方法
Rust实现C++继承式包装第三方类型的方案
你可以通过Rust标准库的Deref、DerefMut trait实现方法的自动转发,完全满足你描述的调用需求,具体实现如下:
步骤1:实现自动转发trait
针对你给出的结构体定义,增加Deref和DerefMut实现:
use some_3rd_crate; use std::ops::{Deref, DerefMut}; struct MyStruct { third_type: some_3rd_crate::Type, } impl Deref for MyStruct { // 指定解引用后的目标类型为你包装的第三方类型 type Target = some_3rd_crate::Type; fn deref(&self) -> &Self::Target { &self.third_type } } // 若需要调用第三方类型接收&mut self的可变方法,额外实现DerefMut impl DerefMut for MyStruct { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.third_type } }
效果说明
完成上述实现后,你就可以直接按照期望的方式调用第三方类型的所有公开方法:
let mt = MyStruct{third_type: some_3rd_crate::Type::new()}; // 会自动通过Deref转发到内部third_type的对应方法 mt.call_3rd_party_function();
这个特性是Rust编译器内置的:当调用的方法不存在于当前类型时,会自动尝试递归解引用,查找目标类型上的匹配方法,行为和C++的公有继承高度一致。
补充说明
- 如果你需要覆写第三方类型的某个方法,直接在
impl MyStruct块中定义同名方法即可,编译器会优先调用你自定义的实现,不会走自动解引用逻辑 - 如果你不需要暴露第三方类型的所有公开方法,不要用
Deref方案,手动实现你需要暴露的方法做转发即可,示例如下:
impl MyStruct { // 仅转发需要公开的指定方法 pub fn call_3rd_party_function(&self) { self.third_type.call_3rd_party_function() } // 你的自定义逻辑 pub fn my_custom_func(&self) { // 自定义处理 } }
内容的提问来源于stack exchange,提问作者There is nothing we can do
相关产品推荐
相关产品推荐

