Misc #13804
openProtected methods cannot be overridden
Description
In Ruby, the main reason you would use protected instead of private is because you want different instances of the same class lineage to be able to access the method.
However, the rules around protected (callable only where self of the context is the same as the [...] method definition) means that protected method effectively cannot be overridden by subclasses. The redefinition of the method resets the protected access check to the subclass, so that instances of the parent class (or other subclasses) cannot call the method anymore.
Is the recommendation that using protected is just bad practice and should be avoided? Or is there a way to make the protected behavior aware of the parent method that is being overridden and keep the access check at the same level in the class hierarchy?
Example:
class Person
def initialize(ssn)
@ssn = ssn
end
def same?(other)
tax_id == other.tax_id
end
protected
def tax_id
@ssn
end
end
class HappyPerson < Person
def shout
'yay!'
end
end
# corporations are people now
class Corporation < Person
def initialize(ein)
@ein = ein
end
protected
def tax_id
@ein
end
end
bob = Person.new('000-00-0001')
sally = HappyPerson.new('000-00-0002')
acme = Corporation.new('00-0000001')
puts bob.same? bob # true
puts bob.same? sally # false
puts sally.same? bob # false
puts acme.same? bob # false
puts bob.same? acme #=> protected method `tax_id' called ... (NoMethodError)
No data to display