Руби Классы
Классы
В объектно-ориентированном программировании класс представляет собой расширяемый программный код-шаблон для создания объектов, предоставляющий начальные значения для состояния (переменные-члены) и реализации поведения. Во многих языках имя класса используется как имя класса (сам шаблон), имя конструктора класса по умолчанию (подпрограмма, создающая объекты), а также как тип объектов, создаваемых при создании экземпляра класса; эти различные понятия легко объединить.
Определение класса
Классы в Ruby являются первоклассными объектами, каждый из которых является экземпляром класса Class.
- Объявление классов начинается с ключевого слова class, за которым следует имя.
- Имя должно начинаться с заглавной буквы, и по соглашению имена, содержащие более одного слова, запускаются вместе с каждым словом, начинающимся с заглавной буквы, и без разделительных символов.
- Класс может содержать переменную класса, переменную экземпляра и метод, а также вызовы методов, которые выполняются в контексте класса во время чтения, например, attr_accessor.
- Объявление класса завершается ключевым словом end.
Пример :
class SampleClass
# some code describing the class behavior
def sample_method
end
end
Конкретизация:
Экземпляр объекта создается из класса посредством процесса, называемого экземпляром. В Ruby он создается с помощью метода Class new.
Пример:
std1 = Student.new(parameters)
Переменные экземпляра:
Переменные экземпляра создаются для каждого экземпляра класса и доступны только в этом экземпляре. Переменные, начинающиеся с символа @, являются «переменными экземпляра». Вне определения класса, используя открытые методы экземпляра, значение переменной экземпляра может быть прочитано или изменено.
Пример:
class Calculation
@x = 100
def add_num
@x = 200
end
def show_data
puts 'Value of x is : ', @x
end
end
instance = Calculation.new
instance.show_data
instance.add_num
instance.show_data
Выход:
Значение х составляет: Значение х составляет: 200
Выходные данные приведенного выше кода показывают пустые значения (nil) и 200. @x определено ниже класса Calculation и является переменной экземпляра для объекта класса, тогда как @x, определенное внутри метода add_num, является переменной экземпляра, принадлежащей экземплярам Calculation. Это две разные переменные, и первая доступна только в методе класса (доступ к нему осуществляется в методах add_num и show_data).
Методы доступа:
В предыдущем разделе мы уже видели, что переменная экземпляра может быть доступна или изменена только в пределах определения метода экземпляра. Если вы хотите получить к нему доступ извне, вам нужно определить общедоступные методы доступа. Вот пример:
мы уже нашли
class MyData
def set_data(n)
@x = n
end
def get_data
@x
end
end
d = MyData.new
puts d.set_data(1000)
puts d.get_data
Выход :
1000
1000
Переменные класса:
Переменные класса связаны с иерархией классов и совместно используются классом, его подклассами и его экземплярами. Переменная класса должна начинаться с @@ (два знака «at»). Остальная часть имени следует тем же правилам, что и переменные экземпляра.
Пример:
class MyData
@@x = 1
def add_n
@@x = @@x + 10
end
def value
@@x
end
end
ins1 = MyData.new
ins2 = MyData.new
puts ins1.value
ins1.add_n
puts ins1.value
puts ins2.value
Выходы:
1 11 11
Переменные экземпляра класса:
Классы могут иметь переменные экземпляра. Это дает каждому классу переменную, которая не является общей для других классов в цепочке наследования.
class Employee
class << self; attr_accessor :instances; end
def store
self.class.instances ||= []
self.class.instances << self
end
def initialize name
@name = name
end
end
class Overhead < Employee; end
class Programmer < Employee; end
Overhead.new('Martin').store
Overhead.new('Roy').store
Programmer.new('Erik').store
puts Overhead.instances.size # => 2
puts Programmer.instances.size # => 1
Методы класса:
Объявление метода класса в Ruby аналогично обычному методу, за исключением того, что методы класса имеют префикс self или имя класса, за которым следует точка. Методы класса выполняются на уровне класса и могут быть вызваны без экземпляра объекта. Они могут получить доступ к переменным класса, но не могут получить доступ к переменным экземпляра. Вот пример:
Пример:
class Student
def self.no_students
puts 'There are five hundred students in my school.'
end
end
Student.no_students
Выход :
В моей школе пятьсот учеников.
Видимость класса: публичная, частная и охраняемая
Ruby предоставляет три уровня доступности методов: Public, Private и Protected.
- Открытый метод: по умолчанию все методы в классах Ruby доступны всем.
- Закрытый метод: этот метод может использоваться только другими методами внутри объекта, в классе которого он определен.
- Защищенный метод: метод видим для методов текущего объекта, а также для объектов того же типа, когда второй объект находится в области действия первого объекта.
Защищенный метод похож на закрытый метод в том, что он может быть вызван только из реализации класса или его подклассов. Он отличается от закрытого метода тем, что его можно явно вызывать в любом экземпляре класса, и он не ограничен неявным вызовом self.
Пример:
class School
def no_of_students
puts 'There are five hundred students in my school.'
end
private
def class_v
puts 'There are 70 students in class V.'
end
end
school = School.new
school.no_of_students
school.class_v
Выход:
В моей школе пятьсот учеников. abc.rb: 14: в `<main> ': закрытый метод` class_v' вызван для # <School: 0x12dcf68> (NoMethodError)
В приведенном выше примере school.no_of_students работает, но school.class_v выдает ошибку, поскольку закрытый метод не может быть вызван вне области действия класса. Закрытые методы могут быть вызваны только неявно, см. Следующий пример:
Пример:
class School
def no_of_students
puts 'There are five hundred students in my school.'
class_v
end
private
def class_v
puts 'There are 70 students in class V.'
end
end
school = School.new
school.no_of_students
Выход :
В моей школе пятьсот учеников. В V классе 70 учеников.
Пример: Защищенный контроль доступа
class Item
def initialize(price)
@price = price
end
def price
@price
end
def compare_price(c)
if c.price > price
"Second item's price is bigger."
else
"Second item's price is equal or less."
end
end
protected :price
end
item1 = Item.new(55)
item2 = Item.new(34)
puts item1.compare_price(item2)
puts item1.price
Выход :
Цена второго предмета равна или меньше. abc.rb: 23: в `<main> ': защищенный метод` price' вызвал # <Item: 0x142c9e0 @pri ce = 55> (NoMethodError)
В приведенном выше примере мы сравниваем один экземпляр Item с другим экземпляром Item. Сравнение зависит от результата обращения к цене метода. Объект, выполняющий сравнение (item), должен попросить другой объект (item2) выполнить свой метод price. Таким образом, цена не может быть частной. Поэтому мы назвали защищенную видимость. Item1 и item2 являются экземплярами одного и того же класса, причем цена защищена, а не закрытая, item1 может запросить item2 для исполнения цены. Но если вы попытаетесь вызвать метод price объекта item, когда self - это нечто иное, чем объект item, метод завершится ошибкой (поэтому он показывает ошибку).
Методы получения и установки:
Переменные экземпляра создаются для каждого экземпляра класса и доступны только в этом экземпляре. Но переменные экземпляра объекта на самом деле не являются частными, вы просто не можете их видеть. Чтобы получить доступ к переменной экземпляра, вам нужно создать метод получения и установки. Методы getter возвращают значение конкретной переменной экземпляра. Вот пример:
Пример:
class Student
def initialize(student_name, id)
@student_name = student_name
@id = id
end
def student_name
@student_name
end
end
std1 = Student.new("Sara", 5)
puts std1.student_name
Выход :
Сара
В приведенном выше примере метод student_name. это метод получения
Метод 'setter' используется для изменения значения переменных экземпляра извне. Вот пример:
Пример:
class Student
def initialize(sname)
@sname = sname
end
def sname
@sname
end
def sname=(new_name)
@sname = new_name
puts @sname
end
end
# you could the access @sname variable as
a = Student.new('Sara')
puts a.sname
a.sname ='Robin'
Выход :
Сара Робин
В приведенном выше примере мы определили метод установки sname =, а переменной экземпляра @sname присвоено значение параметра new_name.
attr_accessor, attr_reader, attr_writer:
Ruby предоставляет несколько методов, чтобы легко выполнить вышеуказанную задачу: attr_accessor, attr_reader, attr_writer, где attr_accessor предоставит вам функциональность get / set, читатель предоставит только getter, а writer предоставит только setter. Метод attr_accessor создает оба getter, setter методы и их переменные экземпляра. Вот пример:
Пример:
class Student
def initialize(sname)
@sname = sname
end
attr_accessor :sname
end
# attr_accessor generates variable @sname accessor methods automatically:
a = Student.new('Sara')
puts a.sname
a.sname ='Robin'
puts a.sname
Выход :
Сара Робин
Пример: attr_reader, attr_writer
Вы можете сделать ту же работу, используя методы attr_reader и attr_writer:
class Student
attr_reader :sname
attr_writer :sname
end
s1 = Student.new
s2 = Student.new
s1.sname ="Sara"
s2.sname ="Robin"
puts s1.sname
puts s2.sname
Выход :
Сара Робин
Константа класса Ruby:
Константы могут быть определены внутри классов, но, в отличие от переменных экземпляра, они доступны вне класса.
Пример :
class ConstClass
Color1='Red'
Color2='Green'
Color3='White'
def show
puts "#{Color1} #{Color2} #{Color3}"
end
end
puts( ConstClass::Color1)
ConstClass.new.show
Выход :
красный Красный зеленый белый
Наследование:
Наследование - это связь между двумя классами. Класс может наследовать функциональность и переменные от суперкласса, который также упоминается как родительский класс или базовый класс. Ruby не поддерживает множественное наследование, поэтому класс в Ruby может иметь только один суперкласс. В следующем примере все функции и не приватные переменные наследуются дочерним классом от суперкласса.
class Student
def schooldetails
puts 'There are 700 students in our school.'
end
end
class Classfive < Student # < means inherit
def class5
puts 'There are 75 students in Class V.'
end
end
instance = Classfive.new
instance.class5
instance.schooldetails
Выходы:
В классе V 75 учеников. В нашей школе 700 учеников.
Вы можете получить доступ к методу родителя с помощью ключевого слова super, если ваш класс переопределяет метод из родительского класса (суперкласса).
class Student
def schooldetails
puts 'There are 700 students in our school.'
end
end
class Classfive < Student # < means inherit
def schooldetails
super
puts 'There are 75 students in Class V.'
end
end
instance = Classfive.new
instance.schooldetails
Выходы:
В нашей школе 700 учеников. В классе V 75 учеников.
В глубокой строке наследования вы можете напрямую обращаться к методам родительского класса, используя методы доступа по псевдониму .
class X
class V
def ccccc
"Class V "
end
end
class VI < V
alias vcv ccccc
def ccccc
vcv + "VI "
end
end
class VII < VI
def ccccc
vcv + "VII "
end
end
puts V.new.ccccc
puts VI.new.ccccc
puts VII.new.ccccc
Выход
Класс V Класс V VI Класс V VII
Синглтон классы:
В Ruby есть способ определить методы, специфичные для конкретного объекта, и такие методы называются Singleton Methods. Когда вы объявляете одноэлементный метод для объекта, Ruby автоматически создает класс для хранения только одноэлементных методов. Вновь созданный класс называется Singleton Class. Это полезно, когда вы хотите получить доступ к этому экземпляру в разных частях приложения, например, в функции регистрации, связи с внешними системами, доступа к базе данных и т. Д.
http://stackoverflow.com/questions/212407/what-exactly-is-the-singleton-class-in-ruby
tutorial1 = String.new
def tutorial1.size
"Learn Ruby"
end
tutorial2 = String.new
puts tutorial1.singleton_methods
puts tutorial2.singleton_methods
Выход:
Выучить Ruby строка 0
Класс Singleton - это специфичный для объекта анонимный класс, который автоматически создается и вставляется в иерархию наследования.
Вы можете использовать singleton_method, чтобы получить список имен для всех одноэлементных методов объекта. Вот пример:
tutorial1 = String.new
def tutorial1.size
"Learn Ruby"
end
puts tutorial1.size
puts tutorial1.class
#Here is another instance of String Class and call size method on it
tutorial2 = String.new
puts tutorial2.size
Выход :
Размер
Вы также можете получить доступ к одноэлементному классу объекта, используя следующий синтаксис:
класс << объект
Вот пример:
arra1 = []
class << arra1
def foo
"Hello World!"
end
end
puts arra1.singleton_methods
Выход :
Foo
Предыдущий: Ruby Methods
Далее: Рубиновые Модули и Миксины
Новый контент: Composer: менеджер зависимостей для PHP , R программирования