Лучшее руководство по Рубин объектно-ориентированного в 2024 году. В этом руководстве вы можете изучить Определение класса Рубин,определения объектов в Ruby,инициализировать метод,переменные экземпляра,Аксессоры (аксессор) и метод записи (сеттер),Методы экземпляра,Методы класса переменные класса &,to_s метод,Контроль доступа,наследование классов,перегрузка методов,Оператор Перегрузки,Замороженный объект,константы класса,Используйте создавать объекты выделяют,информация о классе,
Рубин является чисто объектно-ориентированный язык программирования, Ruby, все находится в виде объектов. Каждое значение в Ruby, является объектом, даже самые примитивные вещи: строки, числа и даже истинные и ложные объекты. Сам класс являетсяобъектом,которыйявляется экземпляромклассаClass. В этой главе вы объяснить все основные функции, связанные с объектно-ориентированного Ruby.
Класс используется для формирования указанного объекта, который сочетает в себе представления данных и способы организации данных в аккуратную упаковку. данные и методы класса называются членами класса.
Когда вы определяете класс, вы на самом деле определить план для типа данных. Это на самом деле не определяет каких-либо данных, но определение того, что название средства класса, то есть, определение того, что представляет собой объект класса будет, и какие действия могут быть выполнены на объекте.
Определение класса начинается с ключевого словакласса, за которым следует имя класса,и , наконец ,заканчиваютсяраздельным представлением свернуть такие определения. Например, мы используем класс ключевое слово, чтобы определить класс Box, следующим образом:
class Box code end
По соглашению, имя должно начинаться с заглавной буквы, если она содержит более одного слова, первые буквы каждого слова, но здесь не разделителем (например: CamelCase).
Класс предоставляет план для объекта, поэтому в основном, объект создается в соответствии с классом. Мы используемновое ключевое слово , чтобы объявить объект класса.Следующий оператор оговаривает класс 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 метод экземпляра , который вы определяете , чтобы вернуть строковое представление объекта.Вот простой пример, в зависимости от ширины и высоты представляют собой объекты 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)
Рубин предоставляет вам с тремя уровнями методов экземпляра защиты, которые являютсягосударственными, частными или защищенными.Любое приложение контроля доступа не на экземпляре и переменные класса Руби.
Вот простой пример, который демонстрирует синтаксис три модификатора:
#!/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
Это означает, что класс может быть определен классом в качестве текущего объекта для выполнения, но также означает, что мета-класс и определение метод родительского класса во время выполнения процесса доступно.