Как сгруппировать регистрацию типов в инициализаторе суперкласса в ruby? - PullRequest
1 голос
/ 16 марта 2012

Я очень новичок в Ruby .. рассмотрите код ниже, я повторяю оператор if else в каждом подклассе. Есть ли способ сгруппировать это в инициализатор суперкласса? Спасибо за любую помощь!

class TreeItem
    def TreeItem.new(*args)
        if self== TreeItem
            raise "Attempt to create TreeItem"
        else
            super
        end
    end

    def initialize(data)
        @data=data
    end

    def raise_error(data)
        raise "Attempt to create #{self.class} with #{data.class} object"

    end

    def toString()
        raise "Abstract method toString() not implemented #{self}"
    end
end

class IntItem <TreeItem
    def initialize(data)
        if data.kind_of? Integer
            super(data)
        else
            raise_error(data)
        end

    end

end



class StringItem < TreeItem
    def initilize(data)
        if data.kind_of? String
            super(data)
        else
            raise_error(data)
        end
end

1 Ответ

0 голосов
/ 16 марта 2012

Вы можете написать абстрактный метод (я назвал его data_class) для этого:

class TreeItem
  def initialize(data)
    if data.kind_of? data_class
      @data = data
    else
      raise_error(data)            
    end
  end
# ...
end

class IntItem <TreeItem
  def data_class; Integer end
end

class StringItem < TreeItem
  def data_class; String end
end

В этой реализации, если вы попытаетесь создать экземпляр TreeItem, вы получите ошибку method undefined (вы также можете реализовать пользовательский data_class в TreeItem, чтобы вызвать более конкретное исключение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...