Özel Metotlar
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 17 / 57.
Kapsülleme, bir nesnenin nasıl çalıştığını gizlemesi ve küçük bir dizi herkese açık yöntem sunması anlamına gelir. Yöntemler varsayılan olarak herkese açıktır. Bir sınıf gövdesinde private sözcüğünden sonra tanımlanan her yöntem özeldir: nesnenin kendi yöntemleri onu çağırabilir, dış kod çağıramaz:
class Order
def initialize(price, quantity)
@price = price
@quantity = quantity
end
def total
subtotal + shipping
end
private
def subtotal
@price * @quantity
end
def shipping
subtotal >= 50 ? 0 : 5
end
end
order = Order.new(10, 3)
puts order.total
begin
order.subtotal
rescue NoMethodError => e
puts e.message
endÇıktı:
35
private method `subtotal' called for an instance of OrderSınıfın içinde, özel bir metot alıcı olmadan veya self. ile çağrılır. Aynı sınıfa ait olsa bile başka bir nesne üzerinde çağrılması reddedilir:
class Coin
def initialize(cents)
@cents = cents
end
def describe
"#{self.label} / #{label}"
end
def same_as?(other)
other.label == label
end
private
def label
"#{@cents}c"
end
end
a = Coin.new(5)
puts a.describe
begin
a.same_as?(Coin.new(5))
rescue NoMethodError => e
puts e.message
endÇıktı:
5c / 5c
private method `label' called for an instance of Coinprivate bir yöntem adı da alabilir ve def yöntemin adını döndürür; bu nedenle private def helper, tek bir yöntemi tanımlandığı yerde özel yapar. Üstündeki ve çevresindeki yöntemler herkese açık kalır:
class Greeter
def greet(name)
"#{salutation}, #{name}!"
end
private def salutation
"Hello"
end
def wave
"*waves*"
end
end
g = Greeter.new
puts g.greet("Ada")
puts g.wave
p Greeter.private_instance_methods(false)Çıktı:
Hello, Ada!
*waves*
[:salutation]Yardımcıları özel tutun. Genel yöntemler, bir sınıfın programın geri kalanına verdiği sözdür; özel olanlar daha sonra herhangi bir çağıranı bozmadan yeniden adlandırılabilir veya kaldırılabilir:
class Invoice
def total # public: çağıranlar buna güvenir
net + tax
end
private # daha sonra değiştirmekte serbest
def net
...
end
def tax
...
end
endGörev
Kolayinitialize dışında tek public metodu receipt olan Order sınıfını tamamlayın; bu metot 3 x 12.50 = 37.50, tax 7.50, total 45.00 değerini döndürür. Private metotlar olan subtotal (fiyat çarpı miktar), tax (ara toplamın %20'si) ve total sayıları hesaplar.
Sağlanan kod, siparişleri quantity price satırları olarak okur ve her makbuzu yazdırır. Ardından dışarıdan tax metodunu çağırmayı dener ve Ruby bunu reddettiğinde tax is private yazdırır.
Kodunuz order.rb dosyasına gider. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'order'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
orders = input.map do |line|
quantity, price = line.split
Order.new(quantity.to_i, price.to_f)
end
orders.each { |o| puts o.receipt }
begin
orders[0].tax
puts "tax is public"
rescue NoMethodError
puts "tax is private"
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