【发布时间】:2016-03-03 16:30:18
【问题描述】:
我看到了这样的this library:
class A
# ...
class B < A
# ...
end
end
这不奇怪吗?我得到的概念是您可以在其他类中声明类,但那些嵌套类继承自父类。这不是无限循环吗?
也许它比看起来简单,但这张图片让我犹豫了很多。我是否在这里遗漏了一些隐藏的好处,或者我不知道的特殊 Ruby 习语?
【问题讨论】:
标签: ruby
我看到了这样的this library:
class A
# ...
class B < A
# ...
end
end
这不奇怪吗?我得到的概念是您可以在其他类中声明类,但那些嵌套类继承自父类。这不是无限循环吗?
也许它比看起来简单,但这张图片让我犹豫了很多。我是否在这里遗漏了一些隐藏的好处,或者我不知道的特殊 Ruby 习语?
【问题讨论】:
标签: ruby
命名空间和子类化是两个不同的东西。他们之间没有任何关系。
通过做:
class A
class B
end
end
您在A 的命名空间中定义B,因此A::B(但B 不是A 的子类;实际上它是Object 的子类)。
通过做:
class A
end
class B < A
end
您将B 定义为A 的子类(但B 不在A 的命名空间中;实际上它在主环境::(或Object::)的命名空间中.
在你的例子中:
class A
class B < A
end
end
两者同时发生,但相互独立,并不矛盾。
【讨论】:
除了@sawa 的回答:这在重构过程中作为中间步骤很有用。
说,我遇到了一些大胖类,我清楚地看到这里可以提取几个子类。但我还不知道他们的名字。当我这样做时,我可能会在此过程中多次重命名它们。这使得为每个子类创建文件成为不必要的障碍。所以我从在那里声明子类开始,然后在同一个文件中移动代码。当我有点满意时,然后我会将子类移动到它们的专用文件中。或者也许我不会,如果它们非常小(而且我觉得它们不值得单独的文件)。
【讨论】: