Pertanyaan Bagaimana cara mendapatkan nama kelas orang tua di Ruby


Anggaplah saya memiliki kelas A dan B dimana B mewarisi A. Bagaimana cara mencetak nama kelas orang tua di B

class A
end

class B < A
end

Beberapa hal yang saya coba

>> B.new.class #=> B   #which is correct
>> B.new.parent  #=> Undefined method `parent`
>> B.parent   #=> Object
>> B.parent.class #=> Class

Terima kasih :)


58
2018-02-08 18:15


asal


Jawaban:


class A
end

class B < A
end

B.superclass # => A
B.superclass.name # => "A"

97
2018-02-08 18:16



Jika Anda ingin mencoba tumpukan leluhur penuh:

object.class.ancestors

Contohnya:

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]

44
2017-09-05 05:26



Mengingat sebuah objek (Instansiated Class) Anda dapat memperoleh Kelas induk

>> x = B.new
>> x.class.superclass.name
=>"A"

15
2017-07-11 20:37



Dalam hal google membawa siapa pun di sini yang bekerja di Rails, apa yang mungkin Anda inginkan adalah base_class, sebagai superclass akan melintasi struktur warisan ActiveRecord juga.

class A < ActiveRecord::Base
end

class B < A
end

> A.superclass
=> ActiveRecord::Base
> B.superclass
=> A

> A.base_class
=> A
> B.base_class
=> A

Bahkan lebih jauh...

class C < B
end

> C.base_class
=> A

Dengan kata lain, base_class memberi Anda bagian atas pohon warisan tetapi terbatas pada konteks aplikasi Anda. Peringatan yang adil meskipun, sejauh Rails berkaitan dengan "aplikasi Anda" termasuk setiap permata yang Anda gunakan, jadi jika Anda memiliki model yang subclass sesuatu yang didefinisikan dalam permata, base_class akan mengembalikan kelas permata, bukan milikmu.


11
2017-11-12 19:41



Istilah yang Anda cari adalah superclass. Dan memang bisa Anda lakukan B.superclass mendapatkan A. (Anda juga bisa melakukannya B.ancestors untuk mendapatkan daftar semua kelas dan modul yang diwarisi dari - sesuatu seperti [B, A, Object, Kernel, BasicObject].)


8
2018-02-08 18:16



Warisan adalah hubungan antara dua kelas. Inheritance menciptakan suatu   hubungan orang tua anak antar kelas. Ini adalah mekanisme untuk kode   menggunakan kembali dan mengizinkan ekstensi independen dari perangkat lunak asli melalui   kelas dan antarmuka publik. Manfaat dari warisan adalah itu   kelas bawah hierarki mendapatkan fitur dari mereka yang lebih tinggi,   tetapi juga dapat menambahkan fitur khusus mereka sendiri.

Di Ruby, kelas hanya dapat mewarisi dari satu kelas lainnya. (mis. kelas dapat mewarisi dari kelas yang mewarisi dari kelas lain yang mewarisi dari kelas lain, tetapi kelas tunggal tidak dapat mewarisi dari banyak kelas sekaligus). Kelas BasicObject adalah kelas induk dari semua kelas di Ruby. Karena itu, metodenya tersedia untuk semua objek kecuali ditimpa secara eksplisit. 

Ruby mengatasi pewarisan kelas tunggal sekaligus dengan menggunakan mixin.

Saya akan mencoba menjelaskan dengan sebuah contoh.

module Mux
 def sam
  p "I am an module"
 end
end
class A
  include Mux
end
class B < A
end
class C < B
end
class D < A
end

Anda dapat melacak dengan menggunakan class_name.superclass.name dan melakukan proses ini kecuali Anda menemukan BasicOject dalam hierarki ini. BasicObject adalah kelas super o setiap kelas. mari kita lihat misalkan kita ingin melihat hierarki hierarki kelas C.

 C.superclass
   => B
 B.superclass
  => A
 A.superclass
  => Object
 Object.superclass
  => BasicObject

Anda dapat melihat seluruh hierarki kelas C. Poin yang perlu diperhatikan menggunakan pendekatan ini Anda tidak akan menemukan modul yang disertakan atau ditambahkan di kelas induk.

Ada pendekatan lain untuk menemukan hierarki lengkap termasuk modul. Menurut dokumen Ruby leluhur. Mengembalikan daftar modul yang termasuk / ditambahkan dalam mod (termasuk mod itu sendiri).

C.ancestors
 => [C, B, A, Mux, Object, Kernel, BasicObject]

Di sini, Mux dan Kernel adalah Modul.

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)


1
2018-06-06 12:19