Передача данных с наследованием? - PullRequest
1 голос
/ 01 апреля 2011

У меня есть несколько классов, которые наследуются от одного класса.Каждый дочерний класс создает несколько структур данных, после чего родительский класс выполняет операции с этими данными.

Вопрос: Как заставить родительский класс использовать эти данные независимо от того, был ли создан объект или нет.

class A
  def self.static_test
    puts @myvar + "_static"
  end
  def instantiated_test
    puts @myvar + "_instantiated"
  end
end
class B<A
  @myvar = "this works B"
end
class C<A
  @myvar = "this works C"
end

B.static_test
B.new.instantiated_test
C.static_test
C.new.instantiated_test
B.static_test
B.new.instantiated_test

Мне понадобится приведенный выше коддля печати:

this works B_static
this works B_instantiated
this works C_static
this works C_instantiated
this works B_static
this works B_instantiated

Я использую Ruby 1.8.7.

Редактировать: Похоже, мой первоначальный вопрос был немного запутанным.Мне нужны как статические, так и инстанцированные методы для использования одних и тех же данных.Методы не будут делать то же самое, хотя.Я обновил пример кода, чтобы отразить это.

Ответы [ 3 ]

3 голосов
/ 01 апреля 2011
def instantiated_test
  self.class.static_test
end

Кстати, если вы уверены, что унаследованные классы будут иметь определенную структуру, распакуйте ее в родительский класс.Если вы не уверены, не используйте его вообще из родительского класса.Реализация родителя не должна зависеть от реализации ребенка.

1 голос
/ 01 апреля 2011
class A
  class << self
    attr_reader :myvar
  end
  # Alternatively:
  # def self.myvar; @myvar; end

  def self.static_test
    puts myvar
  end
  def instantiated_test
    puts self.class.myvar
  end
end
class B<A
  @myvar = "this works B"
end
class C<A
  @myvar = "this works C"
end

B.static_test
#=> this works B
B.new.instantiated_test
#=> this works B
C.static_test
#=>this works C
C.new.instantiated_test
#=>this works C
B.static_test
#=> this works B
B.new.instantiated_test
#=> this works B
0 голосов
/ 01 апреля 2011
class A
  def self.static_test
    puts @myvar
  end
  def instantiated_test
    puts @myvar
  end
end
class B<A
  @myvar = "this works B"
  @@myvar = @myvar
  def initialize
    @myvar = @@myvar
  end
end
class C<A
  @myvar = "this works C"
  @@myvar = @myvar
  def initialize
    @myvar = @@myvar
  end
end

Но это уродливо и требует дублирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...