在C++中,我编写了以下代码:
class MessageHandler {
virtual MediaPlayer::Ptr handle_message(...);
virtual RtspServer::Ptr decideRtspServer(...);
virtual RtspClient::Ptr decideRtspClient(...);
virtual Decoder::Ptr decideDecoder(...);
virtual Renderer::Ptr decideRenderer(...);
};该类处理一条消息,通知使用哪个RtspServer、RtspClient、Decoder、Renderer,并返回一个MediaPlayer。我想为很多设备编写MessageHandlers : Android,Windows,Linux等等,这样我就可以覆盖每一个决定。例如,我可以覆盖decideRenderer来决定一个特定的渲染器,该渲染器只在Linux中可用,但其余的不应该被覆盖,因为它在所有设备上都是相同的。
我希望在Rust中做同样的事情:拥有默认决策,但在为特定设备实现MessageHandler时,如果需要,可以“覆盖”一个决策。
如何在Rust中实现类似的功能?我不关心它看起来像不像OOP,我只想防止重写相同的代码。
发布于 2020-09-29 19:04:50
什么反对特征对象?大致是这样的:
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>传递。
https://stackoverflow.com/questions/64110587
复制相似问题