кодесурса

Руби Классы

script1adsense2code
script1adsense3code

Классы

В объектно-ориентированном программировании класс представляет собой расширяемый программный код-шаблон для создания объектов, предоставляющий начальные значения для состояния (переменные-члены) и реализации поведения. Во многих языках имя класса используется как имя класса (сам шаблон), имя конструктора класса по умолчанию (подпрограмма, создающая объекты), а также как тип объектов, создаваемых при создании экземпляра класса; эти различные понятия легко объединить.

Определение класса

Классы в 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 программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code