Latest web development tutorials

Рубин объектно-ориентированного

Рубин является чисто объектно-ориентированный язык программирования, Ruby, все находится в виде объектов. Каждое значение в Ruby, является объектом, даже самые примитивные вещи: строки, числа и даже истинные и ложные объекты. Сам класс являетсяобъектом,которыйявляется экземпляромклассаClass. В этой главе вы объяснить все основные функции, связанные с объектно-ориентированного Ruby.

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

Определение класса Рубин

Когда вы определяете класс, вы на самом деле определить план для типа данных. Это на самом деле не определяет каких-либо данных, но определение того, что название средства класса, то есть, определение того, что представляет собой объект класса будет, и какие действия могут быть выполнены на объекте.

Определение класса начинается с ключевого словакласса, за которым следует имя класса,и , наконец ,заканчиваютсяраздельным представлением свернуть такие определения. Например, мы используем класс ключевое слово, чтобы определить класс Box, следующим образом:

class Box
   code
end

По соглашению, имя должно начинаться с заглавной буквы, если она содержит более одного слова, первые буквы каждого слова, но здесь не разделителем (например: CamelCase).

определения объектов в Ruby

Класс предоставляет план для объекта, поэтому в основном, объект создается в соответствии с классом. Мы используемновое ключевое слово , чтобы объявить объект класса.Следующий оператор оговаривает класс Box два объекта:

box1 = Box.new
box2 = Box.new

инициализировать метод

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

class Box
   def initialize(w,h)
      @width, @height = w, h
   end
end

переменные экземпляра

экземпляра класса недвижимости переменныхявляется то , что они создают при использовании объекта класса станет свойством объекта. Отдельные свойства каждого объекта назначается, среди прочих объектов, и не разделяют ценности. В класс должен использовать оператор @ для доступа к этим свойствам вне класса, он являетсяобщим для использования метод , называемый методы доступадоступа. Здесь мы определим классBox выше в качестве примера, класс Box @width и @height как переменные экземпляра.

class Box
   def initialize(w,h)
      # 给实例变量赋值
      @width, @height = w, h
   end
end

Аксессоры (аксессор) и метод записи (сеттер)

Для того , чтобы использовать внешние переменные класса, мы должны определить эти переменные во внутреннихметодов доступа, сбруя,является эквивалентомгеттер.Следующий пример демонстрирует метод доступа:

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造函数
   def initialize(w,h)
      @width, @height = w, h
   end

   # 访问器方法
   def printWidth
      @width
   end

   def printHeight
      @height
   end
end

# 创建对象
box = Box.new(10, 20)

# 使用访问器方法
x = box.printWidth()
y = box.printHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

Когда приведенный выше код выполняется, он будет производить следующие результаты:

Width of the box is : 10
Height of the box is : 20

По аналогии с методами доступа , используемых для доступа к значения переменных, Ruby предоставляет возможность установить переменную внешнее значение класса А, также известный какинкубационный метод, определяемый следующим образом :

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end

   # 访问器方法
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # 设置器方法
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# 创建对象
box = Box.new(10, 20)

# 使用设置器方法
box.setWidth = 30
box.setHeight = 50

# 使用访问器方法
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

Когда приведенный выше код выполняется, он будет производить следующие результаты:

Width of the box is : 30
Height of the box is : 50

Методы экземпляра

Определитьметоды экземпляра и другие методы , определенные, они используют ключевое слово четкости,но они могут быть использованы только в экземпляре класса, как показано в следующих примерах. Их функция не ограничивается доступ к переменным экземпляра, но и в соответствии с вашими потребностями, чтобы сделать больше других задач.

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 实例方法
   def getArea
      @width * @height
   end
end

# 创建对象
box = Box.new(10, 20)

# 调用实例方法
a = box.getArea()
puts "Area of the box is : #{a}"

Когда приведенный выше код выполняется, он будет производить следующие результаты:

Area of the box is : 200

Методы класса переменные класса &

Переменные класса все экземпляры класса совместно используемых переменных.Другими словами, переменные экземпляра класса могут быть доступны все экземпляры объектов. переменная класса с двумя @ символов (@@) в качестве префикса, переменные класса должны быть инициализированы в определении класса, как показано в следующих примерах.

Метод класса Защиту self.methodname ()определение, метод класса до конца разделителей. Методы класса могут быть использованы с именем классаclassname.methodname формы вызова, как показано в следующих примерах:

#!/usr/bin/ruby -w

class Box
   # 初始化类变量
   @@count = 0
   def initialize(w,h)
      # 给实例变量赋值
      @width, @height = w, h

      @@count += 1
   end

   def self.printCount()
      puts "Box count is : #@@count"
   end
end

# 创建两个对象
box1 = Box.new(10, 20)
box2 = Box.new(30, 100)

# 调用类方法来输出盒子计数
Box.printCount()

Когда приведенный выше код выполняется, он будет производить следующие результаты:

Box count is : 2

to_s метод

Любой класс имеетto_s метод экземпляра , который вы определяете , чтобы вернуть строковое представление объекта.Вот простой пример, в зависимости от ширины и высоты представляют собой объекты Box:

#!/usr/bin/ruby -w

class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 定义 to_s 方法
   def to_s
      "(w:#@width,h:#@height)"  # 对象的字符串格式
   end
end

# 创建对象
box = Box.new(10, 20)

# 自动调用 to_s 方法
puts "String representation of box is : #{box}"

Когда приведенный выше код выполняется, он будет производить следующие результаты:

String representation of box is : (w:10,h:20)

Контроль доступа

Рубин предоставляет вам с тремя уровнями методов экземпляра защиты, которые являютсягосударственными, частными или защищенными.Любое приложение контроля доступа не на экземпляре и переменные класса Руби.

  • Открытый метод: Public методы могут быть вызваны какой - либо объект.По умолчанию методы являются открытыми, за исключением метода инициализации всегда частное.
  • Частные методы: Частные методы не могут быть доступны или смотреть вне класса.Только методы класса могут получить доступ к закрытым членам.
  • Защищенный метод: Защищенный метод может быть вызван только класс объектов и его подклассы.Доступ может быть осуществлено только во внутреннем классе и его подклассов.

Вот простой пример, который демонстрирует синтаксис три модификатора:

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end

   # 实例方法默认是 public 的
   def getArea
      getWidth() * getHeight
   end

   # 定义 private 的访问器方法
   def getWidth
      @width
   end
   def getHeight
      @height
   end
   # make them private
   private :getWidth, :getHeight

   # 用于输出面积的实例方法
   def printArea
      @area = getWidth() * getHeight
      puts "Big box area is : #@area"
   end
   # 让实例方法是 protected 的
   protected :printArea
end

# 创建对象
box = Box.new(10, 20)

# 调用实例方法
a = box.getArea()
puts "Area of the box is : #{a}"

# 尝试调用 protected 的实例方法
box.printArea()

Когда приведенный выше код выполняется, он будет производить следующие результаты. При этом первый вызов метода завершается успешно, но второй способ будет иметь проблемы.

Area of the box is : 200
test.rb:42: protected method `printArea' called for #
<Box:0xb7f11280 @height=20, @width=10> (NoMethodError)

наследование классов

Наследование, объектно-ориентированное программирование является одним из наиболее важных понятий. Наследование позволяет определить класс на основе другого класса, что делает создание и поддержание приложений гораздо проще.

Наследование позволяет повторно использовать код и быстрое выполнение, к сожалению, Ruby не поддерживает множественное наследование, но поддержка РубиMixins.Mixin подобен конкретной реализации множественного наследования, множественное наследование, только часть интерфейса является наследуемым.

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

Рубин также предоставляет понятие подкласс подкласс, который наследуется, следующий пример иллюстрирует эту концепцию. Расширение синтаксиса класса очень прост. Просто добавьте <имя персонажа и родительский класс к утверждению класс может. Например, следующее определение классаBigBoxBox является подкласс:

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 实例方法
   def getArea
      @width * @height
   end
end

# 定义子类
class BigBox < Box

   # 添加一个新的实例方法
   def printArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# 创建对象
box = BigBox.new(10, 20)

# 输出面积
box.printArea()

Когда приведенный выше код выполняется, он будет производить следующие результаты:

Big box area is : 200

перегрузка методов

Хотя вы можете добавлять новые функции в производном классе, но иногда вы можете захотеть изменить поведение было определено в методах родительского класса. После этого вы можете сохранить тот же имя метода, функция может быть перегружена методы, как показано в следующих примерах:

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 实例方法
   def getArea
      @width * @height
   end
end

# 定义子类
class BigBox < Box

   # 改变已有的 getArea 方法
   def getArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# 创建对象
box = BigBox.new(10, 20)

# 使用重载的方法输出面积
box.getArea()

Запуск в приведенном выше примере выход:

Big box area is : 200

Оператор Перегрузки

Мы хотим использовать оператор + выполняет векторное сложение двух объектов Box, используйте оператор * на ширину и высоту коробки умножаются, используя унарный оператор - ширина и высота Box сведены на нет. Вот версия класса по математике с определением Box Operator:

class Box
  def initialize(w,h) # 初始化 width 和 height
    @width,@height = w, h
  end

  def +(other)         # 定义 + 来执行向量加法
    Box.new(@width + other.width, @height + other.height)
  end

  def -@               # 定义一元运算符 - 来对 width 和 height 求反
    Box.new(-@width, -@height)
  end

  def *(scalar)        # 执行标量乘法
    Box.new(@width*scalar, @height*scalar)
  end
end

Замороженный объект

Иногда мы хотим, чтобы предотвратить объект изменен. В объекте, метод замораживания может достичь этого, он может эффективно поместить объект в константу. Любой объект может быть заморожен путем вызоваObject.freeze.Замороженный объект не может быть изменен, то есть, вы не можете изменить свои переменные экземпляра.

Вы можете использоватьObject.frozen? Метод , чтобы проверить , был ли данный объект был заморожен.Если объект был заморожен, метод возвращает истину, в противном случае она возвращает ложное значение. Следующий пример иллюстрирует эту концепцию:

#!/usr/bin/ruby -w

# 定义类
class Box
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end

   # 访问器方法
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # 设置器方法
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# 创建对象
box = Box.new(10, 20)

# 让我们冻结该对象
box.freeze
if( box.frozen? )
   puts "Box object is frozen object"
else
   puts "Box object is normal object"
end

# 现在尝试使用设置器方法
box.setWidth = 30
box.setHeight = 50

# 使用访问器方法
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

Когда приведенный выше код выполняется, он будет производить следующие результаты:

Box object is frozen object
test.rb:20:in `setWidth=': can't modify frozen object (TypeError)
        from test.rb:39

константы класса

Вы можете определить постоянный внутренний класс, путем прямого числового или строкового значения для определения переменной, которая не требует постоянного использования @ или @@. По соглашению, имя постоянного использования в верхнем регистре.

После того, как константа определена, вы не можете изменить его значение, вы можете получить прямой доступ к внутренней константы в классе, как доступ к той же переменной, но если вы хотите получить доступ внешнего постоянного класса, то вы должны использоватьимя класса :: постоянный , как показано в следующих примерах.

#!/usr/bin/ruby -w

# 定义类
class Box
   BOX_COMPANY = "TATA Inc"
   BOXWEIGHT = 10
   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end
   # 实例方法
   def getArea
      @width * @height
   end
end

# 创建对象
box = Box.new(10, 20)

# 调用实例方法
a = box.getArea()
puts "Area of the box is : #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"

Когда приведенный выше код выполняется, он будет производить следующие результаты:

Area of the box is : 200
TATA Inc
Box weight is: 10

Константы классов могут быть унаследованы, но и так же, как метод экземпляра перегружена.

Используйте создавать объекты выделяют

Там может быть случай, вы хотите создать объект без вызова конструктораинициализации объекта, этот объект создается с помощью нового метода, в этом случае, вы можете вызвать выделение , чтобы создать неинициализированный объект, как следующие примеры следующим образом:

#!/usr/bin/ruby -w

# 定义类
class Box
   attr_accessor :width, :height

   # 构造器方法
   def initialize(w,h)
      @width, @height = w, h
   end

   # 实例方法
   def getArea
      @width * @height
   end
end

# 使用 new 创建对象
box1 = Box.new(10, 20)

# 使用 allocate 创建两一个对象
box2 = Box.allocate

# 使用 box1 调用实例方法
a = box1.getArea()
puts "Area of the box is : #{a}"

# 使用 box2 调用实例方法
a = box2.getArea()
puts "Area of the box is : #{a}"

Когда приведенный выше код выполняется, он будет производить следующие результаты:

Area of the box is : 200
test.rb:14: warning: instance variable @width not initialized
test.rb:14: warning: instance variable @height not initialized
test.rb:14:in `getArea': undefined method `*' 
   for nil:NilClass (NoMethodError) from test.rb:29

информация о классе

самостоятельно в Ruby и Java это похожи, но разные. методы Java ссылаются в метод экземпляра, так что это, как правило, относится к текущему объекту. Строка кода Руби по линии, так и в другом контексте (контекст) сам имеют различное значение. Давайте посмотрим на следующие примеры:

#!/usr/bin/ruby -w

class Box
   # 输出类信息
   puts "Class of self = #{self.class}"
   puts "Name of self = #{self.name}"
end

Когда приведенный выше код выполняется, он будет производить следующие результаты:

Class of self = Class
Name of self = Box

Это означает, что класс может быть определен классом в качестве текущего объекта для выполнения, но также означает, что мета-класс и определение метод родительского класса во время выполнения процесса доступно.