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
endOutput:
true
protected method `balance' called for an instance of AccountPerbedaannya 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.hiddenprotected 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).inspectOutput:
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.subtotalTantangan
MudahLengkapi 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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classVariabel instansmethod dan selfto_s dan inspectRingkasan: Kartu Perpustakaan4Enkapsulasi
private methodprotected methodprivate setterMelindungi StatusUlasan, Mesin Penjual Otomatis7Polimorfisme dan Duck Typing
PolimorfismeDuck TypingMethod Abstrakcase dan classRingkasan: Method Pembayaran2Accessor dan self
Pembaca dan PenulisSetter Kustomself dalam methodIdentitas dan KesetaraanRangkuman: Daftar Kontak8Special method
Kesetaraan dan hashOperator methodPengindeksan dan penambahanKoleksi kustomRingkasan: Pecahan11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam Buku3Method dan Variabel class
Method classVariabel instance classKonstantaMethod pabrikRangkuman: Kode KuponLatihan sendiri: Compiler Ruby online