Я пишу фреймворк для запроса Mediawiki API. У меня есть класс Page
, который представляет статьи на wiki, и у меня также есть класс Category
, который is-aPage
с более конкретными методами (например, с возможностью подсчета количества членов в категории. также есть метод 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
То, что я хотел бы сделать, это быть в состоянии определить, пытается ли пользователь моей инфраструктуры создавать экземпляр класса Mediawiki с помощью объекта страницы (то есть Page.new("Category:My Category")
), и если да, то создайте экземпляр Category
, а не объект Page
, непосредственно из конструктора Page
.
Мне кажется, что это должно быть возможно, потому что это напоминает однонаправленное наследование таблицы в Rails, но я не уверен, как заставить его работать.
Метод 'category?' В 'Page' подразумевает, что класс предка знает о дочернем классе, который не похож на хорошую идею, OOP-мудрый. Кроме того, вы можете немного уточнить свое последнее предложение? –
@Mladen: Не уверен в синтаксисе Ruby, но, похоже, он хочет 'Category foo = new Page()' вместо 'Page bar = new Category()'. –
Тогда он должен, вероятно, взглянуть на http://stackoverflow.com/questions/746207/ruby-design-pattern-how-to-make-an-extensible-factory-class и, как правило, немного рассказать о фабричной схеме , –