Menu
CoddyTech

Ö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ı gizleyip küçük bir genel yöntemler kümesi sunması anlamına gelir. Yöntemler varsayılan olarak geneldir. 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ışarıdaki 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 Order

Sınıfın içinde, özel bir metot alıcı belirtilmeden ya da self. ile çağrılır. Aynı sınıftan biri 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 Coin

private ayrıca 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 yöntemler ise çağıran kodları bozmadan daha sonra yeniden adlandırılabilir veya kaldırılabilir:

class Invoice
  def total              # public: çağıran kodlar buna bağımlıdır
    net + tax
  end

  private                # daha sonra değiştirilebilir

  def net
    ...
  end

  def tax
    ...
  end
end
challenge icon

Görev

Kolay

Order sınıfını tamamla. initialize dışında tek genel metodu receipt olan bu sınıf, 3 x 12.50 = 37.50, tax 7.50, total 45.00 değerini döndürür. Özel metotlar olan subtotal (fiyat çarpı miktar), tax (ara toplamın %20'si) ve total sayıları hesaplar.

Verilen 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 değerini yazdırır.

Kodunu order.rb dosyasına yaz. main.rb verilen girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'order'

# Sağlanan giriş/çıkış 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
quiz iconKendini test et

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

Kendi başına pratik yap: Online Ruby derleyicisi