首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是Rust等同于C++的虚拟重写,以防止代码重写?

什么是Rust等同于C++的虚拟重写,以防止代码重写?
EN

Stack Overflow用户
提问于 2020-09-29 06:46:54
回答 1查看 96关注 0票数 2

在C++中,我编写了以下代码:

代码语言:javascript
复制
class MessageHandler {
    virtual MediaPlayer::Ptr handle_message(...);
    virtual RtspServer::Ptr decideRtspServer(...);
    virtual RtspClient::Ptr decideRtspClient(...);
    virtual Decoder::Ptr decideDecoder(...);
    virtual Renderer::Ptr decideRenderer(...);
};

该类处理一条消息,通知使用哪个RtspServerRtspClientDecoderRenderer,并返回一个MediaPlayer。我想为很多设备编写MessageHandlers : Android,Windows,Linux等等,这样我就可以覆盖每一个决定。例如,我可以覆盖decideRenderer来决定一个特定的渲染器,该渲染器只在Linux中可用,但其余的不应该被覆盖,因为它在所有设备上都是相同的。

我希望在Rust中做同样的事情:拥有默认决策,但在为特定设备实现MessageHandler时,如果需要,可以“覆盖”一个决策。

如何在Rust中实现类似的功能?我不关心它看起来像不像OOP,我只想防止重写相同的代码。

EN

回答 1

Stack Overflow用户

发布于 2020-09-29 19:04:50

什么反对特征对象?大致是这样的:

代码语言:javascript
复制
trait MessageHandler {
    handle_message(...) -> Box<MediaPlayer> {
        Box::new(DefaultMediaPlayer{})
    }
    decideRtspServer(...) -> Box<RtspServer> {
        Box::ne(DefaultRtspServer{})
    }
    // and others
};

struct LinuxMessageHandler {...}
impl MessageHandler for LinuxMessageHandler {
    handle_message(...) -> Box<MediaPlayer> {
        Box::new(LinuxSpecificMediaPlayer{})
    }
    // do not implement any other method: instead, automatically "inherit" them from MessageHandler
}

然后,这些“特征对象”被作为例如Box<dyn MessageHandler>传递。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64110587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档