Korumalı Metotlar
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 18 / 57.
Bir protected yöntemi public ve private arasında yer alır. Kodun dışından çağrılamaz, ancak aynı sınıftaki herhangi bir nesne onu başka bir nesne üzerinde çağırabilir. Bu, iki nesnenin programın geri kalanına göstermedikleri verileri karşılaştırmasını sağlar:
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
endÇıktı:
true
protected method `balance' called for an instance of Accountprivate ile fark, alıcı başka bir nesne olduğunda ortaya çıkar. other.balance, korumalı bir yöntem için çalışır, özel bir yöntem içinse hata verir:
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)Çıktı:
3
private refused other.hiddenprotected, örneğin iki nesneden hangisinin kazanacağına karar vermek için bir değeri yalnızca aynı sınıftaki nesneler arasında paylaşmanın yaygın yolu olan attr_reader ile de çalışır:
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).inspectÇıktı:
true
["Ada"]İşe yarayan en dar kapsam düzeyini seç. public sınıfın arayüzü, protected sınıfın nesnelerinin birbirleriyle karşılaştırdığı veriler, private ise diğer her şey içindir:
public # herkes: order.total
protected # sınıfın nesneleri: Account içinde other.balance
private # yalnızca nesnenin kendisi: subtotal, self.subtotalGörev
KolayTamamla Account sınıfını. Bakiyeyi yalnızca diğer hesaplar okuyabilmelidir: okuyucusunu protected yap. richer_than?(other) bakiyeleri karşılaştırır, transfer_to(other, amount) diğer hesabın protected yöntemi receive(amount) aracılığıyla parayı başka bir hesaba aktarır ve true döndürür; bakiye çok düşük olduğunda false döndürür. to_s yalnızca sahibin adını döndürür.
Sağlanan kod iki sahibin adını ve bakiyelerini, ardından transfer a b 50 komutlarını okur ve ok veya refused yazdırır. Daha sonra Ada is richer (veya Bo is richer ya da equal) yazdırır ve son olarak dışarıdan balance değerini okumayı dener; Ruby bunu reddettiğinde balance is protected yazdırır.
Kodunuzu account.rb dosyasına yazın. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'account'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıf TanımlamaÖrnek DeğişkenleriMetotlar ve selfto_s ve inspectÖzet - Kütüphane Kartı7Çok Biçimlilik ve Ördek Tiplemesi
Çok BiçimlilikÖrdek TiplemesiSoyut Metotlarcase ve SınıflarTekrar - Ödeme Yöntemleri2Erişimciler ve self
Okuyucular ve YazıcılarÖzel Setter'larMetotlarda selfKimlik ve EşitlikTekrar - Kişi Listesi5Kalıtım
Alt sınıflarMetotları geçersiz kılmasuper çağrısıis_a? ve üst sınıflarTekrar - Personel Maaşları8Özel Metotlar
Eşitlik ve hashOperatör Metotlarıİndeksleme ve EklemeÖzel KoleksiyonlarTekrar - Kesirler11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Sınıf Metotları ve Değişkenleri
Sınıf MetotlarıSınıf Örnek DeğişkenleriSabitlerFabrika MetotlarıTekrar - Kupon KodlarıKendi başına pratik yap: Online Ruby derleyicisi