[ruby] Ruby에서 부모의 클래스 이름을 얻는 방법

내가 클래스가 A있고 B어디에 B상속 한다고 가정합시다 A. 부모 클래스 이름을 어떻게 인쇄합니까?B

class A
end

class B < A
end

내가 시도한 몇 가지

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

감사 🙂



답변

class A
end

class B < A
end

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


답변

전체 조상 스택을 원하면 다음을 시도하십시오.

object.class.ancestors

예를 들면 :

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


답변

객체 (Instantiated Class)가 주어지면 부모 클래스를 파생시킬 수 있습니다.

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


답변

Google이 Rails에서 일하는 사람을 여기로 데려 오는 경우 대신 원하는 것은 base_classsuperclass ActiveRecord 상속 구조를 통과하는 것처럼 있습니다.

class A < ActiveRecord::Base
end

class B < A
end

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

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

더 나아가 …

class C < B
end

> C.base_class
=> A

즉, base_class상속 트리의 맨 위를 제공하지만 애플리케이션의 컨텍스트로 제한됩니다. 하지만 Rails에 관한 한 “귀하의 애플리케이션”에는 사용중인 모든 gem이 포함되어 있으므로 gem에 정의 된 항목을 하위 클래스로 분류하는 모델이있는 경우 사용자가 아닌 base_classgem의 클래스를 반환합니다.


답변

찾고있는 용어는 superclass입니다. 그리고 실제로 당신은 할 수 B.superclass얻을 A. ( B.ancestors상속 된 모든 클래스 및 모듈 목록을 가져올 수도 있습니다 [B, A, Object, Kernel, BasicObject]..)


답변

상속은 두 클래스 간의 관계입니다. 상속은 클래스간에 부모 자식 관계를 만듭니다. 이는 코드 재사용을위한 메커니즘이며 공개 클래스 및 인터페이스를 통해 원래 소프트웨어의 독립적 인 확장을 허용하는 메커니즘입니다. 상속의 이점은 계층 아래의 클래스가 상위 계층의 기능을 가져 오지만 고유 한 특정 기능을 추가 할 수도 있다는 것입니다. .

Ruby에서 클래스는 하나의 다른 클래스에서만 상속 할 수 있습니다. (즉, 클래스는 다른 클래스에서 상속 된 다른 클래스에서 상속되는 클래스에서 상속 할 수 있지만 단일 클래스는 한 번에 여러 클래스에서 상속 할 수 없습니다.) BasicObject 클래스는 Ruby의 모든 클래스의 상위 클래스입니다. 따라서 명시 적으로 재정의하지 않는 한 모든 개체에서 해당 메서드를 사용할 수 있습니다.

Ruby는 mixin을 사용하여 단일 클래스 상속을 한 번에 극복합니다.

예를 들어 설명하겠습니다.

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을 사용하여 추적 할 수 있으며이 계층에서 BasicOject를 찾지 못한 경우이 프로세스를 수행 할 수 있습니다. BasicObject는 모든 클래스의 슈퍼 클래스입니다. 클래스 C 계층 트리를보고 싶다고 가정 해 보겠습니다.

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

클래스 C의 전체 계층 구조를 볼 수 있습니다.이 방법을 사용하면 부모 클래스에 포함되거나 앞에 추가 된 모듈을 찾을 수 없습니다.

모듈을 포함하여 완전한 계층 구조를 찾는 또 다른 방법이 있습니다. Ruby doc ancestors 에 따르면 . mod에 포함 / 앞에 추가 된 모듈 목록을 반환합니다 (mod 자체 포함).

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

여기서 Mux와 Kernel은 모듈입니다.

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


답변