Я пытаюсь получить доступ к дате ввода родительского класса от дочернего класса . Я не уверен, как это назвать. Я нашел много информации о доступа к переменным класса, но не переменным экземпляра от дочернего класса . Вот мой код:
class Shape
@var = "woohoo"
Этих переменная известна как экземпляр класса переменной, и причина, по которой люди используют переменный экземпляр класса вместо класса переменной, т.е. @@variable
, точно так что дочерние классы не могут получить к нему доступ. Поскольку переменные экземпляра класса - это то, как переменные класса работают на других языках, @@variables
не используются много в рубине, потому что их поведение удивительно, если вы исходите из другого языка с переменными класса.
Ваш случай использования, по-видимому, требует, чтобы переменная класса была доступна в дочернем классе, поэтому у нее есть @@variable
.
EDIT: Я хочу, чтобы отдельные экземпляры класса ребенка, чтобы заменить «WooHoo» строка со своими уникальными строками.
Вы можете использовать экземпляр класса переменных для этого:
class Shape
@var = "shapehoo"
class <<self
attr_accessor :var
end
def display_class_instance_var
puts Shape.var
end
end
class Rectangle < Shape
@var = "recthoo"
def display_class_instance_var
puts Rectangle.var
end
end
class Circle < Shape
@var = "circlehoo"
def display_class_instance_var
puts Circle.var
end
end
Shape.new.display_class_instance_var
Rectangle.new.display_class_instance_var
Circle.new.display_class_instance_var
Rectangle.new.display_class_instance_var
Shape.new.display_class_instance_var
--output:--
shapehoo
recthoo
circlehoo
recthoo
shapehoo
Как и обычным переменного экземпляр, экземпляр класса переменных являются частными, так что вы должны обеспечить методы доступа, если вы хотите получить доступ их. Аксессоры должны быть в одноплодной классе класса, который можно открыть с помощью синтаксиса:
class <<self
end
Добавлено:
Об этом коде:
class Rectangle < Shape
@length
@width
def initialize (l,w)
@length = l
@width = w
end
В вашем Initialize() метод, вы не устанавливаете переменные @length, @width, которые вы указали выше метода initialize. В ruby @variables присоединяются к любому объекту self
во время создания @variables.Вот то, что ваш код выглядит более подробные данные:
class Rectangle < Shape
#self=Rectangle class
@length
@width
def initialize (l,w)
#self=a new instance of the Rectangle class created by initialize
@length = l
@width = w
end
В результате, в @variables, созданные в Initialize() прикрепляются к новому экземпляру, в то время как @variables объявлена выше Initialize() прикрепляются к класс Rectangle, что означает, что они являются совершенно разными переменными.
Кстати, отступов в рубин 2 места - не 4 пространства. – 7stud
@ 7stud вам не нужно следовать руководству по стилю к письму, которое вы знаете – LukeP
@ LukeP, это правда, но тогда вы никогда не сможете показать свой код никому другому рубисту и не задавать вопросы о своем коде на открытом форуме. – 7stud