Ruby не предлагает эту функциональность, нет. Вы несете ответственность за то, чтобы ваши классы реализовали то, что должны были реализовать.
Одной из причин того, что такая функциональность невозможна для Ruby, является то, что классы Ruby могут быть открыты повторно, и Ruby поддерживает загрузку произвольного кода во время выполнения, поэтому мы не можем знать, реализует ли класс определенный интерфейс, пока мы не попытаемся вызвать его .
Предположим, Animal
должен иметь метод eat
, и я делаю следующее:
class Cat < Animal
def talk
puts "meow"
end
end
class Cat
def eat
puts "om nom nom"
end
end
К концу этого файла Cat
будет иметь определение eat
, потому что классы Ruby могут открываться и изменяться несколько раз. Должен ли код ошибки после первого определения, потому что eat
еще не был определен? Такая реализация повредит больше, чем поможет, поскольку повторное открытие классов является обычным явлением, даже если этот пример надуман. Должен ли он выдать ошибку после вызова метода eat
и его не существует, поэтому мы можем быть уверены, что он определен, как только он нам понадобится? Что ж, если бы метод отсутствовал, то в любом случае это произошло бы . Интерпретатор никогда не сможет узнать, находится ли другое определение класса в пути, поэтому он никогда не сможет отключить вас, пока метод не будет вызван.
Короче говоря, суперклассы просто не могут требовать определения метода в Ruby, потому что динамическая природа классов противоречит такой цели.
Извините! Это место, где юнит-тестирование может пригодиться, однако, чтобы ваши подклассы делали то, что они должны делать, в любом случае.