Мне нравится ответ от pvandenberk, но я бы улучшил его следующим образом:
module Canine # in Ruby, abstract classes are known as modules
def bark
fail NotImplementedError, "A canine class must be able to #bark!"
end
end
Теперь, если вы сделаете класс, принадлежащий Canine
"абстрактному классу" (т. Е. Классу, который имеет модуль Canine
в своих предках), он будет жаловаться, если обнаружится, что метод #bark
не реализован:
class Dog
include Canine # make dog belong to Canine "abstract class"
end
Dog.new.bark # complains about #bark not being implemented
class Dog
def bark; "Bow wow!" end
end
# Now it's OK:
Dog.new.bark #=> "Bow wow!"
Обратите внимание, что поскольку классы Ruby не являются статическими, но всегда открыты для изменений, сам класс Dog
не может обеспечить существование методов #bark
, поскольку он не знает, когда он должен быть завершен. Если вы, как программист, делаете это, то вы можете проверить это в это время.