수퍼 클래스에서 서브 클래스의 클래스 인스턴스 변수 초기화

Logain

아래 코드의 수퍼 클래스가 주어지면 모든 하위 클래스에 인스턴스 변수가 있기를 원합니다.

아래 코드는이를 수행하지만 가능한 모든 하위 클래스에 대해 해당 변수를 제대로 초기화하지 못합니다.

내 슈퍼 클래스의 고유 클래스를 열었습니다. 다음은 코드입니다 ( rubyfiddle 에도 있음 ).

class SomeSuperClass
  class << self
    attr_accessor :variable
    @variable = ': )' # This does't seem to have any effect
  end
  self.variable = 'This only works for the superclass'
end

class SubClass < SomeSuperClass; end

puts SomeSuperClass.variable # => 'This only works for the superclass'
puts SubClass.variable # => ''

SomeSuperClass.variable = 'I am the superclass'
SubClass.variable = 'I am the subclass'

puts SomeSuperClass.variable # => 'I am the superclass'
puts SubClass.variable # => 'I am the subclass'

가능한 모든 하위 항목을 초기화하고 싶습니다. 처음 두 개의 풋에서만 SomeSuperClass.variable초기화됩니다. 가능한 모든 하위 클래스에 대해이 변수를 초기화하는 방법을 모르겠습니다. 어떤 아이디어?

내가 찾은 가장 좋은 해결책은 다음과 같이 접근자를 재정 의하여 변수를 지연 초기화하는 것입니다.

class SomeSuperClass
  def self.variable
    @variable ||= 'Hi'
  end
end

동기 :

주어진 클래스의 모든 하위 클래스가 필요합니다.이를 Vigilant라고 부르고 직접 하위 클래스에서 발생하는 몇 가지 일을 모니터링 할 수 있습니다. 이 정보는 클래스에 저장되므로 각각에 대해 다른 상태를 갖습니다.

두 클래스 A <B가 동일한 변수를 수정하므로 클래스 변수를 사용할 수 없습니다. 하위 클래스에 직접 액세스 할 수도 없으므로 Vigilant의 모든 하위 클래스에 하위 클래스에 대한 정보를 저장하고 검색 할 수있는 기능을 제공 할 방법이 필요했습니다.

고유 클래스를 여는 접근자를 정의함으로써 다음과 같이 말할 수 있습니다.

A.singleton_class.instance_eval { attr_accessor :x }

메서드 (접근 자)가 수퍼 클래스 고유 클래스에 추가되어 조회에서 찾을 수 있으므로 모든 서브 클래스 B class B < A; end는 이제를 수행 B.x할 수 있습니다.

첫 번째 예는 Bx가 Ax와 다르다는 것을 보여줍니다.

자, 제가 정말로 이해하지 못하는 것은 x가 어디에 있는지입니다. 접근자가 아닌 변수. 내가 할 경우 B.instance_variables그것을 보여줍니다 []B.singleton_class.instance_variables와 같은,

7 스터드

모든 하위 클래스가 단일 클래스 / 고유 클래스에 변수를 갖기를 원합니다.

죄송합니다. 여기서하는 일이 아닙니다.

puts SomeSuperClass.variable # => 'This only works for the superclass'
puts SubClass.variable # => '

왜 그 글을

SomeSuperClass.variable 

의사 코드와 동일합니다.

SomeSuperClassSingletonClass.variable

또는 실제 코드 :

SomeSuperClass.singleton_class.variable

클래스와 싱글 톤 클래스는 두 개의 다른 클래스입니다.

또한이 코드 :

  class << self
    attr_accessor :variable
    @variable = ': )' # This does't seem to have any effect   
  end

이 코드와 같은 방식으로 @variable에 대한 접근자를 만들지 않습니다.

class Dog
  attr_accessor :x

  @x = 'hello'
end

puts Dog.x

... 해당 @x 변수에 대한 접근자를 만들지 않습니다.

--output:--
undefined method `x' for Dog:Class (NoMethodError) 

attr_accessor ()가하는 일은 다음과 같습니다.

class Dog
  def x
    @x
  end

  def x=(val)
    @x = val
  end

  #=====

  @x = 'hello'
end

이러한 메서드는 모든 정의 외부에 정의 된 클래스 인스턴스 변수 @x 와는 아무 관련이 없습니다 . @ 변수는 그 순간에 self가되는 어떤 객체에 대해서도 조회 (또는 설정)됩니다. 이러한 def를 호출 할 수있는 유일한 개체는 Dog 클래스의 인스턴스이므로 x는 Dog 클래스가 아닌 Dog 인스턴스에서 조회 (또는 설정)됩니다.

또한 줄이 @x = 'hello'실행될 self는 Dog 클래스와 같으므로 @x는 Dog 클래스에 연결됩니다.

싱글 톤 클래스에 인스턴스 변수를 설정하는 유스 케이스가 없다고 생각합니다. 다음은 수행하려는 작업입니다.

class SomeSuperClass
  class << self
    attr_accessor :variable
  end

  self.variable = 'hello'

  def self.inherited(subclass)
    subclass.singleton_class.instance_eval do
      attr_accessor :variable
    end

    subclass.variable = "Hi"
  end

end

class SubClass < SomeSuperClass
end

puts SomeSuperClass.variable
puts SubClass.variable


--output:--
hello
Hi

이 코드는 class instance variables. 에 대한 사용 사례가 있다고 생각되면 singleton class instance variables들어 보겠습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

서브 클래스의 Ruby 클래스 인스턴스 변수

분류에서Dev

서브 클래스에서 슈퍼 클래스 인스턴스 변수 변경

분류에서Dev

수퍼 클래스의 배열에 인스턴스화 된 서브 클래스 추가

분류에서Dev

C ++ 클래스의 함수에서 다른 클래스 인스턴스화

분류에서Dev

수퍼 클래스의 인스턴스 별 서브 클래스 클래스의 호출 메서드

분류에서Dev

서브 클래스 초기화시 슈퍼 클래스 변수에 대한 접근성

분류에서Dev

클래스 인스턴스에서 가변 함수의 인수 캡슐화

분류에서Dev

C ++ 클래스에서 많은 수의 변수 초기화

분류에서Dev

수퍼 클래스 변수에 의한 서브 클래스 참조?

분류에서Dev

수퍼 클래스 목록에서 서브 클래스 구성원 찾기. 씨#

분류에서Dev

동일한 변수에서 클래스의 다중 인스턴스화

분류에서Dev

하위 클래스의 인스턴스에서 수퍼 클래스의 속성에 액세스

분류에서Dev

Swift : 클래스 변수의 초기화 인수로서의 클로저

분류에서Dev

기본 클래스에서 파생 된 클래스의 인스턴스를 함수로 전달

분류에서Dev

Ruby-클래스 변수로서의 인스턴스 변수

분류에서Dev

슈퍼 클래스 클래스 초기화 이전에 서브 클래스 최종 정적 초기화?

분류에서Dev

파이썬에서 클래스 변수로 클래스 인스턴스

분류에서Dev

수퍼 클래스의 속성을 상속하기 위해 Python 클래스를 서브 클래 싱

분류에서Dev

Python의 하위 클래스에서 수퍼 클래스 변수 변경

분류에서Dev

Python의 하위 클래스에서 수퍼 클래스 변수 변경

분류에서Dev

수퍼 클래스에서 서브 클래스의 이름을 얻습니까?

분류에서Dev

서브 클래스 인스턴스 배열에 수퍼 클래스 배열 확장 적용

분류에서Dev

수퍼 클래스에서 하위 클래스의 모든 인스턴스 추적

분류에서Dev

수퍼 클래스의 인스턴스를 사용하여 서브 클래스의 재정의 된 변수에 액세스하는 방법

분류에서Dev

변수에서 다트 클래스 초기화

분류에서Dev

생성자없이 클래스 내에서 변수 초기화

분류에서Dev

추상 클래스에서 Enum 변수 초기화

분류에서Dev

클래스 생성자에서 ifstream 변수 초기화

분류에서Dev

메서드가 호출 될 때 수퍼 클래스를 확장하는 서브 클래스의 인스턴스 가져 오기

Related 관련 기사

  1. 1

    서브 클래스의 Ruby 클래스 인스턴스 변수

  2. 2

    서브 클래스에서 슈퍼 클래스 인스턴스 변수 변경

  3. 3

    수퍼 클래스의 배열에 인스턴스화 된 서브 클래스 추가

  4. 4

    C ++ 클래스의 함수에서 다른 클래스 인스턴스화

  5. 5

    수퍼 클래스의 인스턴스 별 서브 클래스 클래스의 호출 메서드

  6. 6

    서브 클래스 초기화시 슈퍼 클래스 변수에 대한 접근성

  7. 7

    클래스 인스턴스에서 가변 함수의 인수 캡슐화

  8. 8

    C ++ 클래스에서 많은 수의 변수 초기화

  9. 9

    수퍼 클래스 변수에 의한 서브 클래스 참조?

  10. 10

    수퍼 클래스 목록에서 서브 클래스 구성원 찾기. 씨#

  11. 11

    동일한 변수에서 클래스의 다중 인스턴스화

  12. 12

    하위 클래스의 인스턴스에서 수퍼 클래스의 속성에 액세스

  13. 13

    Swift : 클래스 변수의 초기화 인수로서의 클로저

  14. 14

    기본 클래스에서 파생 된 클래스의 인스턴스를 함수로 전달

  15. 15

    Ruby-클래스 변수로서의 인스턴스 변수

  16. 16

    슈퍼 클래스 클래스 초기화 이전에 서브 클래스 최종 정적 초기화?

  17. 17

    파이썬에서 클래스 변수로 클래스 인스턴스

  18. 18

    수퍼 클래스의 속성을 상속하기 위해 Python 클래스를 서브 클래 싱

  19. 19

    Python의 하위 클래스에서 수퍼 클래스 변수 변경

  20. 20

    Python의 하위 클래스에서 수퍼 클래스 변수 변경

  21. 21

    수퍼 클래스에서 서브 클래스의 이름을 얻습니까?

  22. 22

    서브 클래스 인스턴스 배열에 수퍼 클래스 배열 확장 적용

  23. 23

    수퍼 클래스에서 하위 클래스의 모든 인스턴스 추적

  24. 24

    수퍼 클래스의 인스턴스를 사용하여 서브 클래스의 재정의 된 변수에 액세스하는 방법

  25. 25

    변수에서 다트 클래스 초기화

  26. 26

    생성자없이 클래스 내에서 변수 초기화

  27. 27

    추상 클래스에서 Enum 변수 초기화

  28. 28

    클래스 생성자에서 ifstream 변수 초기화

  29. 29

    메서드가 호출 될 때 수퍼 클래스를 확장하는 서브 클래스의 인스턴스 가져 오기

뜨겁다태그

보관