首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rust中重写替代的方法

问在Rust中重写替代的方法
EN

Stack Overflow用户
提问于 2020-04-16 06:07:42
回答 1查看 613关注 0票数 3

我对Rust中没有结构继承和方法覆盖感到有点困惑。

例如,当我们想要实现具有自定义控件外观能力的图形库时,在其他流行的面向对象语言如Java、C#等中,我们只是将一些渲染方法虚化,让用户扩展我们的控件元素类并覆盖这些方法来改变渲染逻辑。

由于Rust没有任何结构继承和方法重写,您能解释一下如何以Rust的方式实现类似的功能吗?

EN

回答 1

Stack Overflow用户

发布于 2020-04-16 15:45:42

在编程中有不同的paradigms,面向对象只是其中之一。其他的例子有:命令式编程、函数式编程等等。

使用所有这些范例可以做什么没有区别,使用所有这些范例,您可以为完全相同的一组问题实现算法。可以很容易地证明这一点,即您可以编写编译器,将一种语言/范例中的程序转换为另一种语言中的目标。最后,所有的程序都在同一个CPU上执行,这个CPU根本不知道面向对象。

甚至不是所有的OOP语言都支持继承,而其他语言甚至支持从多个类继承。在有关OOP的现代理论中,越来越多的人质疑继承是否是一件好事。有一种composition over inheritance的原则,建议用组合来代替子类。

在您的示例中,这意味着您可以将此逻辑拆分成不同的部分,而不是让一个类来完全处理与按钮相关的所有事情。在你的一条评论中,你有一个按钮的例子,你想让它看起来不一样。这可以通过将完整的显示代码移动到button类的委托来完成。如果你想给按钮一个完全不同的外观,你只需要给按钮设置一个不同的显示代理,实现不同的布局(也可能是通过组合不同的现成部件)。

在Rust的情况下,这个组合可以很容易地与特征一起制作。在OOP语言中,它们是接口。因此,您可以定义一个特征,一些实现呈现的代码必须实现该特征,并将其分配给按钮类struct,无论您如何命名它。每次需要渲染按钮时,它都会将作业委托给当前在其中配置的渲染代理。

但这在很大程度上还只是面向对象的思考。Rust是多范式的。所以你可能决定根本不做OOP。例如,在函数式编程中,您可以使用高阶函数来实现这一点,或者将渲染与其他方面(如单击处理或保持应用程序的状态)完全分离。后者的示例可以在React (JavaScript)、om.next或Re-frame (ClojureScript)或Elm Architecture (Elm)中看到。

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

https://stackoverflow.com/questions/61239441

复制
相关文章

相似问题

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