gpt4 book ai didi

ruby - 在实例化时将类转换为子类

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:48 25 4
gpt4 key购买 nike

我正在编写一个查询 Mediawiki API 的框架.我有一个 Page 类代表 wiki 上的文章,我还有一个 Category 类,是一个 Page 具有更具体的方法(比如能够计算类别中的成员数量。我还有一个方法 Page#category? 确定实例化的 Page 对象实际上代表一个Mediawiki分类页面,通过查询API来确定文章的命名空间。

class Page
def initialize(title)
# do initialization stuff
end

def category?
# query the API to get the namespace of the page and then...
namespace == CATEGORY_NAMESPACE
end
end

class Category < Page
# ...
end

我想做的是能够检测我的框架的用户是否尝试使用 Page 对象实例化 Mediawiki 类别(即 Page.new("Category:My Category")),如果是,则直接从 Page 构造函数实例化一个 Category 对象,而不是 Page 对象。

在我看来这应该是可能的,因为它让人想起 Rails 中的单表继承,但我不确定如何让它发挥作用。

最佳答案

好的,有几件事:

您不能A的实例转换为A的子类B的实例>。至少,不是自动的。 B 可以(并且通常确实)包含 A 中不存在的属性,它可以具有完全不同的构造函数等。所以,AFAIK,没有任何 OO 语言允许您“转换”以这种方式上课。

即使在静态类型语言中,当您实例化B,然后将其分配给类型为A的变量a时,它是仍然是 B 的实例,它不会被转换为其祖先类。

Ruby 是一种具有强大反射功能的动态语言,因此您始终可以决定在运行时实例化哪个类 - 看看这个:

puts "Which class to instantiate: "
class_name = gets.chomp
klass = Module.const_get class_name
instance = klass.new

因此,这里不需要任何转换 - 只需首先实例化您需要的类即可。

另一件事:正如我在评论中提到的,category? 方法完全错误,因为它违反了 OOP 原则。在 Ruby 中,您可以 - 并且应该 - 使用方法 is_a?,因此您的检查将如下所示:

if instance.is_a? Category
puts 'Yes, yes, it is a category!'
else
puts "Nope, it's something else."
end

这只是冰山一角,还有很多关于实例化不同类的内容,我在评论中链接的另一个问题可能是一个很好的起点,尽管那里的一些代码示例可能会让您感到困惑。但绝对值得了解它们。

编辑:在重新阅读您更新的问题后,在我看来,正确的方法是创建一个工厂类并让它检测和实例化不同的页面类型。因此,用户不会直接调用 Page.new,而是调用类似

MediaWikiClient.get_page "Category:My Category"

get_page方法会实例化相应的类。

关于ruby - 在实例化时将类转换为子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3374065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com