2015-06-09 6 views
0

Я пытаюсь получить доступ к члену родительского класса из дочернего класса. Я не уверен, как это назвать. Я нашел много информации о доступе к переменным класса, но не переменным экземпляра из дочернего класса. Вот мой код:Доступ к переменной экземпляра из дочерних классов

class Shape 

    @var = "woohoo" 

    def initialize() 

    end 

    def area() 

    end 

end 


class Rectangle < Shape 

    @length 
    @width 

    def initialize (l,w) 
     @length = l 
     @width = w 
    end 

    def area() 
     print @var 
     return @length * @width 
    end 

end 

У меня ошибка при попытке печати @var. Я попробовал родительский. @ Var, Shape. @ Var и ряд других комбинаций, которые я ожидал бы от других языков. Каков правильный способ печати (и, если возможно, изменения) этой переменной в экземпляре дочернего класса?

EDIT: Я хочу, чтобы отдельные экземпляры дочернего класса заменяли строку 'woohoo' своими уникальными строками.

Спасибо!

+0

Кстати, отступов в рубин 2 места - не 4 пространства. – 7stud

+0

@ 7stud вам не нужно следовать руководству по стилю к письму, которое вы знаете – LukeP

+0

@ LukeP, это правда, но тогда вы никогда не сможете показать свой код никому другому рубисту и не задавать вопросы о своем коде на открытом форуме. – 7stud

ответ

2

Вы можете использовать «супер», чтобы вызвать блок инициализации родительского класса и определить переменную экземпляра «@var». В этом случае вы можете изменить значение этой переменной экземпляра для другого экземпляра. Как это:

class Shape 
    def initialize() 
    @var = "woohoo" 
    end 
end 

class Rectangle < Shape 
    def initialize(l, w) 
    @length = l 
    @width = w 
    super() 
    end 

    def area() 
    print @var 
    return @length * @width 
    end 

    def var=(new_value) 
    @var = new_value 
    end 
end 

a = Rectangle.new(1,1) 
a.area 
# => woohoo1 
a.var = "kaboom" 
a.area 
# => kaboom1 

b = Rectangle.new(2,2) 
b.area 
# => woohoo4 

Или OFC вы можете использовать attr_accessor

class Shape 
    def initialize 
    @var = "woohoo" 
    end 
end 

class Rectangle < Shape 

    attr_accessor :var 
    def initialize(l, w) 
    @length, @width = l, w 
    super() 
    end 

    def area() 
    print @var 
    return @length * @width 
    end 
end 

a = Rectangle.new(1,1) 
a.area 
# => woohoo1 
a.var = "kaboom" 
a.area 
# => kaboom1 

b = Rectangle.new(2,2) 
b.area 
# => woohoo4 
+0

* и определить переменную класса «@var» * В вашем коде не определены переменные класса любого типа. Важной особенностью переменных экземпляра является то, что они могут иметь разные значения для каждого экземпляра, тогда как переменная класса (экземпляра) имеет одинаковое значение для всех экземпляров. – 7stud

3

Я пытаюсь получить доступ к дате ввода родительского класса от дочернего класса . Я не уверен, как это назвать. Я нашел много информации о доступа к переменным класса, но не переменным экземпляра от дочернего класса . Вот мой код:

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, что означает, что они являются совершенно разными переменными.

+0

см. Мое редактирование на вопрос –

+0

зачем использовать класс << self insted только для доступа? и зачем вызывать Rectangle.var insted o self.var ord just @var? Это просто вопрос;) –

+0

@Lukas Baliak, 1) 'зачем использовать класс << self insted только для доступа?» - поскольку вызов 'attr_accessor' на уровне класса создавал бы аксессоры для переменной экземпляра с именем @ var - not accessor для переменной экземпляра класса с именем @var. 2) 'и зачем вызывать Rectangle.var insted o self.var' - потому что внутри метода экземпляра' self' равен экземпляру * экземпляра *, вызывающему этот метод, но метод accessor определен в объекте класса, поэтому вы необходимо вызвать аксессуар с объектом класса. Вы можете написать 'self.class.var'. – 7stud

Смежные вопросы