Хорошо, пара вещей:
Вы не можете преобразовать экземпляр класса 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?
просто неправильный, поскольку он нарушает принципы ООП. В 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
будут создавать соответствующий класс.