Méthodes protégées
Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 18 sur 57.
Une méthode protected se situe entre les méthodes publiques et privées. Le code externe ne peut pas l’appeler, mais tout objet de la même classe peut l’appeler sur un autre objet. Cela permet à deux objets de comparer des données qu’ils ne montrent pas au reste du programme :
class Account
def initialize(owner, balance)
@owner = owner
@balance = balance
end
def richer_than?(other)
balance > other.balance
end
protected
def balance
@balance
end
end
ada = Account.new("Ada", 500)
bo = Account.new("Bo", 300)
puts ada.richer_than?(bo)
begin
ada.balance
rescue NoMethodError => e
puts e.message
endSortie :
true
protected method `balance' called for an instance of AccountLa différence avec private apparaît lorsque le récepteur est un autre objet. other.balance fonctionne pour une méthode protégée et échoue pour une méthode privée :
class Sample
def initialize(n)
@n = n
end
def compare_protected(other)
other.guarded + guarded
end
def compare_private(other)
other.hidden + hidden
rescue NoMethodError
"private refused other.hidden"
end
protected
def guarded
@n
end
private
def hidden
@n
end
end
a = Sample.new(1)
b = Sample.new(2)
puts a.compare_protected(b)
puts a.compare_private(b)Sortie :
3
private refused other.hiddenprotected fonctionne également avec attr_reader, la manière habituelle de partager une valeur uniquement entre les objets d’une même classe, par exemple pour déterminer lequel de deux objets gagne :
class Player
attr_reader :name
def initialize(name, rating)
@name = name
@rating = rating
end
def stronger?(other)
rating > other.rating
end
protected
attr_reader :rating
end
a = Player.new("Ada", 1200)
b = Player.new("Bo", 1100)
puts a.stronger?(b)
puts [a, b].select { |pl| pl.stronger?(b) }.map(&:name).inspectSortie :
true
["Ada"]Choisissez le niveau le plus restrictif qui convient. public correspond à l’interface de la classe, protected aux données que les objets de la classe comparent entre eux, et private à tout le reste :
public # n'importe qui : order.total
protected # objets de la classe : other.balance dans Account
private # seulement l'objet lui-même : subtotal, self.subtotalDéfi
FacileComplète la classe Account. Le solde doit être lisible uniquement par les autres comptes : rends son accesseur protégé. richer_than?(other) compare les soldes, transfer_to(other, amount) transfère de l’argent vers un autre compte au moyen de la méthode protégée receive(amount) de cet autre compte et renvoie true, ou renvoie false lorsque le solde est insuffisant. to_s renvoie uniquement le nom du propriétaire.
Le code fourni lit les deux propriétaires et leurs soldes, puis les commandes transfer a b 50, en affichant ok ou refused. Il affiche ensuite Ada is richer (ou Bo is richer, ou equal) et tente enfin de lire balance depuis l’extérieur, en affichant balance is protected lorsque Ruby refuse.
Ton code doit être placé dans account.rb. main.rb contient le code fourni pour les entrées et sorties et ne peut pas être modifié.
Essayez vous-même
require_relative 'account'
# Code d'entrée/sortie fourni : le garder tel quel
input = []
while (line = gets)
input << line.chomp
end
accounts = input[0..1].map do |line|
owner, balance = line.split
Account.new(owner, balance.to_i)
end
a, b = accounts
input.drop(2).each do |line|
_, from, to, amount = line.split
source = from == "a" ? a : b
target = to == "a" ? a : b
puts source.transfer_to(target, amount.to_i) ? "ok" : "refused"
end
if a.richer_than?(b) then puts "#{a} is richer"
elsif b.richer_than?(a) then puts "#{b} is richer"
else puts "equal"
end
begin
a.balance
puts "balance is public"
rescue NoMethodError
puts "balance is protected"
end
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Classes et objets
Travailler avec des fichiersDéfinir des classesVariables d’instanceMéthodes et selfto_s et inspectRécapitulatif - Carte de bibliothèque4Encapsulation
Méthodes privéesMéthodes protégéesSetters privésProtéger l’étatRécapitulatif - Distributeur automatique7Polymorphisme et typage canard
PolymorphismeTypage canardMéthodes abstraitesCas et classesRécapitulatif - méthodes de paiement10Patrons de conception – Partie 2
Délégation avec ForwardablePatron DécorateurPatron BuilderPatron État2Accesseurs et self
Lecteurs et écrivainsSetters personnalisésself dans les méthodesIdentité et égalitéRécapitulatif - Liste de contacts5Héritage
Sous-classesRedéfinition des méthodesAppeler superis_a? et ancêtresRécapitulatif - Paie du personnel8Méthodes spéciales
Égalité et hachageMéthodes d’opérateursIndexation et ajoutCollections personnaliséesRécapitulatif - Fractions11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Compilateur Ruby en ligne