Menu
CoddyTech

protected method

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 18 dari 57.

Sebuah method protected berada di antara public dan private. Kode dari luar tidak dapat memanggilnya, tetapi object apa pun dari class yang sama dapat memanggilnya pada object lain. Ini memungkinkan dua object membandingkan data yang tidak mereka tampilkan kepada bagian program lainnya:

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

Output:

true
protected method `balance' called for an instance of Account

Perbedaannya dari private terlihat saat penerimanya adalah object lain. other.balance berfungsi untuk method protected dan gagal untuk method private:

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)

Output:

3
private refused other.hidden

protected juga berfungsi dengan attr_reader, cara yang biasa digunakan untuk berbagi nilai hanya di antara object dari satu class, misalnya untuk menentukan object mana yang menang:

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

Output:

true
["Ada"]

Pilih tingkat paling terbatas yang sesuai. public untuk interface class, protected untuk data yang dibandingkan oleh object dari class tersebut satu sama lain, dan private untuk semua hal lainnya:

public      # siapa saja: order.total
protected   # object dari class tersebut: other.balance di dalam Account
private     # hanya object itu sendiri: subtotal, self.subtotal
challenge icon

Tantangan

Mudah

Lengkapi class Account. Saldo hanya dapat dibaca oleh account lain, jadi jadikan reader-nya protected. richer_than?(other) membandingkan saldo, transfer_to(other, amount) memindahkan uang ke account lain melalui method protected receive(amount) milik account tersebut dan mengembalikan true, atau mengembalikan false jika saldo terlalu rendah. to_s hanya mengembalikan nama pemilik.

Kode yang disediakan membaca nama pemilik dan saldo untuk kedua account, lalu membaca perintah transfer a b 50, dan mencetak ok atau refused. Setelah itu, kode mencetak Ada is richer (atau Bo is richer, atau equal) dan terakhir mencoba membaca balance dari luar, lalu mencetak balance is protected saat Ruby menolak akses.

Tulis kodemu di account.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

require_relative 'account'

# Kode input/output yang disediakan: biarkan apa adanya
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
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online