Нет стандартного способа сделать это. Обходит как работает наследование. Вы можете реализовать метод B, чтобы сделать логику следующим образом:
def foo
instance_of?(B) ? "bar" : super
end
И вы, конечно, могли бы определить метод класса, который бы сделал это для вас подобно public
и private
.
class Class
def personal(*syms)
special_class = self
syms.each do |sym|
orig = instance_method(sym)
define_method(sym) {|*args| instance_of?(special_class) ? orig.bind(self).call(*args) : super}
end
end
end
Тогда вы можете personal :foo
в B точно так же, как вы private :foo
.
(Это совсем не оптимизировано, и я не реализовал поведение с нулевым аргументом, которое есть у public
и private
, потому что, честно говоря, это огромный PITA, чтобы делать правильно, и даже тогда это взлом.)