【发布时间】:2017-06-04 14:12:08
【问题描述】:
我有两个关于 Ruby 核心 OOP 概念的问题。
我了解方法的显式调用(即使用 self)和隐式调用(即在实例方法中没有初始化的类对象或 self)之间的区别。当我们有显式接收器时,它们非常简洁明了地接收带有 self 的方法(因为它引用当前对象)而不是隐式接收器(我认为在何时使用同名方法或变量等情况下这是非常不确定的初始化),那为什么我们还要隐式调用方法呢?这只是一种偏好,还是因为正确使用私有和公共方法而有必要?
一般来说,OOP 私有方法绑定在类本身内部,不能在子类或外部访问。但是,那些需要私有但也需要在子类中访问的方法,然后在那里使用受保护的方法。但在 Ruby 中,私有和 受保护的方法在继承的类中被访问,唯一的区别是私有方法只能被隐式调用,而受保护的方法可以被隐式或显式调用。我不明白这里的哲学只是因为 ruby 中的隐式调用功能,私有方法的一般定义不同?
【问题讨论】:
-
对于 (1) - ruby 社区不遵守“显式优于隐式”的原则。如果你缺乏上下文,你会看到不清楚的东西,但如果你有很好的理解,就会更简洁和“漂亮”(有人会说)。对于(2)-“一般 OOP”是什么意思?爪哇?我不记得上次在 ruby 代码中看到
protected方法是什么时候了。我同意这有点没用,但我不认为这是对私有和受保护的不太正确的解释。问问自己——为什么私有方法在子类中是不可访问的? -
感谢您的回答,但对于 (1) 我了解授权答案只能由 Matz 本人提供,因为我仍然不明白为什么有些东西虽然不清楚但很漂亮。
-
对于 (2) 是的,我指的是 C# 和 Java。在我看来,私有方法是需要保护和封装的实现,它们仅在公共方法中使用,因此当父私有方法需要在子类中使用时,使用受保护的方法,我认为这是 Java、C# 中的基本目的,但是在 Ruby 中,它略有不同,那是因为隐式和显式接收器?很抱歉,我仍然不清楚您的第二个答案。
-
对于 (1) - 您仍然可以在 java/c# 中调用没有显式接收器(又名
this.)的方法。至于为什么self.不“漂亮”——你一遍又一遍地重复自己。它很冗长。在正常的演讲中,你努力使用尽可能少的词来表达你的观点。与 js 不同,对于self在当前上下文中的含义,ruby 具有合理且易于遵循的规则。作为一名 rubyist,您的目标受众是其他 rubyist。因此self是多余的。此外,如果总是需要显式接收器(如 python),那么 ruby 就不能很好地编写 DSL。 -
对于 (2) - 我只是不同意封装与向孩子隐藏私人事物有关。子类是其父类的进一步规范,而不是局外人。在
Cow的定义中,您仍然指的是Mammal。因此,如果您需要,您仍然应该能够推理哺乳动物的消化道,即使您最终提供的抽象是“物质进入,能量被吸收,物质流出”。