Nesneleri Genişletme
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 28 / 57.
extend, bir modülün metotlarını tüm örneklere eklemek yerine tek bir nesneye ekler. Bir sınıfı genişletmek, bu metotları sınıf nesnesine ekler; böylece bunlar sınıf metotları olur:
module Describable
def describe
"#{name} has #{instance_methods(false).size} methods"
end
end
class Dog
extend Describable
def bark
"Woof"
end
def sit
"sits"
end
end
puts Dog.describeÇıktı:
Dog has 2 methodsextend ile kullanılan bir modül, sınıfın örnek değişkenlerinde durum tutabilir. Onu genişleten her sınıf, sınıf örneği değişkenleri olarak kendi kopyasına sahip olur:
module Counted
def created
@created ||= 0
end
def record
@created = created + 1
end
end
class Order
extend Counted
end
class Invoice
extend Counted
end
Order.record
Order.record
Invoice.record
puts "#{Order.created} #{Invoice.created}"Çıktı:
2 1extend tek bir nesne üzerinde de çalışır. Yalnızca o nesne yöntemleri kazanır; sınıfının diğer örnekleri değişmeden kalır ve yalnızca genişletilen nesne için is_a? true olur:
module Shiny
def polish
"#{self} is shining"
end
end
a = "car"
b = "bike"
a.extend(Shiny)
puts a.polish
puts a.is_a?(Shiny)
puts b.respond_to?(:polish)Çıktı:
car is shining
true
falseBu iki anahtar kelime, aynı modülün yöntemlerini farklı yerlere koyar. include, onları bir sınıfın örnek yöntemleri hâline getirir; extend ise onları genişletilen tek nesnenin yöntemleri hâline getirir:
class Order
include Printable # order.print_me (her örnek)
extend Counted # Order.record (sınıfın kendisi)
end
item.extend(Shiny) # item.polish (yalnızca bu nesne)Görev
KolaySınıfların extend ile kullandığı Registry modülünü tamamla. register(name), sınıfın @entries içinde tutulan kendi listesine bir ad ekler (liste ilk kullanımda oluşturulur) ve Plugin registered x döndürür; zaten listede bulunan bir ad için Plugin already has x döndürülür. entries listeyi, count ise listenin boyutunu döndürür. Plugin ve Theme sınıflarının her ikisi de Registry modülünü genişletir ve ayrı listeler tutar.
Sağlanan kod, plugin name veya theme name biçimindeki satırları okur, eşleşen sınıf üzerinde register çağrısı yapar ve yanıtı yazdırır. Son olarak plugins: a, b (2) ve themes: ... ifadelerini ya da boş bir liste için none (0) ifadesini yazdırır.
Kodun registry.rb, plugin.rb ve theme.rb dosyalarına yazılmalıdır. main.rb sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'registry'
require_relative 'plugin'
require_relative 'theme'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
input.each do |line|
kind, name = line.split
target = kind == "plugin" ? Plugin : Theme
puts target.register(name)
end
[["plugins", Plugin], ["themes", Theme]].each do |label, klass|
list = klass.entries.empty? ? "none" : klass.entries.join(", ")
puts "#{label}: #{list} (#{klass.count})"
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ı6Modüller ve Mixin'ler
Modüller ve includeNesneleri GenişletmeComparable ModülüEnumerable ModülüTekrar - Spor LigiKendi başına pratik yap: Online Ruby derleyicisi