is_a? ve üst sınıflar
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 25 / 57.
is_a?(Class), bir nesnenin bu sınıfın veya onun herhangi bir alt sınıfının örneği olup olmadığını sorar. kind_of? aynı yöntemin başka bir adıdır:
class Animal
end
class Dog < Animal
end
rex = Dog.new
puts rex.is_a?(Dog)
puts rex.is_a?(Animal)
puts rex.is_a?(Object)
puts rex.kind_of?(String)Çıktı:
true
true
true
falseinstance_of? daha katıdır: yalnızca nesnenin kendi sınıfı için true olur. obj.class bu sınıfı döndürür:
class Animal
end
class Dog < Animal
end
rex = Dog.new
puts rex.instance_of?(Dog)
puts rex.instance_of?(Animal)
puts rex.classÇıktı:
true
false
Dogancestors, Ruby'nin metotlar için aradığı sınıfları, sınıfın kendisinden başlayarak listeler; tam liste, 6. bölümde ele alınan Kernel gibi modülleri de içerir, bu nedenle take(3) ilk girdileri gösterir. Sınıflar karşılaştırılabilir: Dog < Animal, Dog sınıfı Animal sınıfından kalıtım aldığında true olur:
class Animal
end
class Dog < Animal
end
p Dog.ancestors.take(3)
puts Dog < Animal
puts Animal < DogÇıktı:
[Dog, Animal, Object]
true
falseKodun bir sınıf grubunu aynı şekilde ele alması gerektiğinde, hangi alt sınıf olursa olsun tüm memelileri saymak gibi, is_a? kullanın. instance_of? ile tek bir sınıfı kesin olarak sormak, biri bir alt sınıf eklediğinde bozulur:
mammals = animals.count { |a| a.is_a?(Mammal) } # köpekler, yarasalar, balinalar...
exact = animals.count { |a| a.instance_of?(Mammal) } # her alt sınıfı kaçırırGörev
KolayHayvan sınıflarını tanımlayın: Animal, Mammal < Animal, Bird < Animal, Dog < Mammal, Bat < Mammal ve Penguin < Bird. Animal bir ad saklar. Ardından functions.rb içindeki describe(animal) yardımcı işlevini tamamlayın: sınıf adı küçük harfle yazılmış olarak Rex is a dog: mammal, Pingu is a penguin: bird döndürür ve grup is_a? kullanılarak belirlenir.
Sağlanan kod dog Rex satırlarını okur, nesneleri oluşturur, her biri için describe çıktısını yazdırır ve ardından mammals: 2, birds: 1 çıktısını verir.
Kodunuz animal.rb, mammal.rb, bird.rb, dog.rb, bat.rb, penguin.rb ve functions.rb dosyalarına yazılmalıdır. main.rb, sağlanan giriş/çıkış kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'animal'
require_relative 'mammal'
require_relative 'bird'
require_relative 'dog'
require_relative 'bat'
require_relative 'penguin'
require_relative 'functions'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
input << line.chomp
end
kinds = { "dog" => "Dog", "bat" => "Bat", "penguin" => "Penguin" }
animals = input.map do |line|
kind, name = line.split
Object.const_get(kinds[kind]).new(name)
end
animals.each { |a| puts describe(a) }
mammals = animals.count { |a| a.is_a?(Mammal) }
birds = animals.count { |a| a.is_a?(Bird) }
puts "mammals: #{mammals}, birds: #{birds}"
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ıKendi başına pratik yap: Online Ruby derleyicisi