Menu
Coddy logo textTech

Ö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 Order

Sı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 Coin

private 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
end
challenge icon

Görev

Kolay

initialize 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
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