Ruby'de ebeveynin sınıf adını nasıl alırım


86

Bir sınıfları olduğunu varsayalım Ave Bnereye Bdevralır A. Ana sınıf adını nasıl yazdırırımB

class A
end

class B < A
end

Denediğim bazı şeyler

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

Teşekkürler :)


5
böyle sıkıştığında daima B.methods.sortirb'yi deneyin . Belki bir şey aradığınız yöntemin adı hakkında size bir ipucu verecektir.
Ivaylo Strandjev

@IvayloStrandjev Bu yardımcı olmayacak. İncelenecek çok fazla yöntem var. Zaman kaybı.
sawa

1
@sawa doğru değil. 30 saniye sürdü. Diğer kullanıcıların benden daha hızlı olmasına rağmen oldukça hızlı olması için yeterli.
Ivaylo Strandjev

9
@checkit: çok daha basit! 8.methods.grep(/class/)Bu tür bir filtrelemeyle sıralamanıza bile gerek yok :)
Sergio Tulentsev

@SergioTulentsev güzel biri !! gerçekten yardımcı olacak :)
Rahul Tapali

Yanıtlar:



62

Tam ata yığını istiyorsanız şunu deneyin:

object.class.ancestors

Örneğin:

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

1
Bir sınıfa dahil olan modülleri de içerdiğini unutmayın. Sen görebilirsiniz Arrayardından Enumerablebir üst olmadığı, fakat bir modül dahil Array . Sadece dersleri istiyorsan böyle bir şey yapabilirsin Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject].
3limin4t0r

18

Bir nesne verildiğinde (Örneklenmiş Sınıf) üst Sınıfı türetebilirsiniz.

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

16

Durumda google Rails çalışıyor burada kimse, ne yerine isteyebilirsiniz getiriyor base_class, hem superclassde ActiveRecord kalıtım yapısını erişir.

class A < ActiveRecord::Base
end

class B < A
end

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

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

Bundan da öte...

class C < B
end

> C.base_class
=> A

Başka bir deyişle, base_classsize miras ağacının tepesini verir, ancak uygulamanızın bağlamıyla sınırlıdır. Adil uyarı olsa da, Rails söz konusu olduğunda, "uygulamanız" kullandığınız tüm mücevheri içerir, bu nedenle bir mücevherde tanımlanmış bir şeyi alt sınıflara ayıran bir modeliniz varsa base_class, sizin değil gem'in sınıfını döndürür.


8

Aradığınız terim superclass. Ve gerçekten B.superclasselde etmek için yapabilirsin A. ( B.ancestorsDevraldığı tüm sınıfların ve modüllerin bir listesini almak için de yapabilirsiniz - buna benzer bir şey [B, A, Object, Kernel, BasicObject].)


2

Kalıtım, iki sınıf arasındaki bir ilişkidir. Kalıtım, sınıflar arasında bir ebeveyn çocuk ilişkisi yaratır. Bu, kodun yeniden kullanımı için bir mekanizmadır ve orijinal yazılımın genel sınıflar ve arayüzler aracılığıyla bağımsız uzantılarına izin verir. Kalıtımın yararı, hiyerarşinin altındaki sınıfların daha yüksek olanların özelliklerini alması, ancak aynı zamanda kendilerine ait belirli özellikleri de ekleyebilmeleridir. .

Ruby'de, bir sınıf yalnızca tek bir diğer sınıftan miras alabilir. (yani bir sınıf, başka bir sınıftan miras alan başka bir sınıftan miras alabilir, ancak tek bir sınıf aynı anda birçok sınıftan miras alamaz). BasicObject sınıfı, Ruby'deki tüm sınıfların ana sınıfıdır. Bu nedenle yöntemleri, açıkça geçersiz kılınmadıkça tüm nesneler tarafından kullanılabilir.

Ruby, mixin'i kullanarak tek seferde sınıf kalıtımının üstesinden gelir.

Bir örnekle açıklamaya çalışacağım.

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

Class_name.superclass.name kullanarak izleyebilir ve bu hiyerarşide BasicOject'i bulmadıysanız bu işlemi yapabilirsiniz. BasicObject, her sınıf için süper sınıftır. C sınıfı hiyerarşi ağacını görmek istediğimizi varsayalım.

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

C sınıfının tüm hiyerarşisini görebilirsiniz. Bu yaklaşımı kullanarak, üst sınıflara dahil edilmiş veya başlarına eklenen modülleri bulamayacağınızı unutmayın.

Modüller dahil olmak üzere tam bir hiyerarşi bulmak için başka bir yaklaşım vardır. Ruby doktor atalarına göre . Modda bulunan / başına eklenen modüllerin bir listesini döndürür (modun kendisi dahil).

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

Burada Mux ve Kernel Modüllerdir.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.