Latest web development tutorials

Rubí orientado a objetos

Ruby es un lenguaje orientado a objetos puro, Ruby, todo está en la forma de los objetos. Cada valor en Ruby es un objeto, incluso lo más primitivo: cadenas, números, e incluso verdaderos y falsos son objetos. La clase en sí es unobjeto quees una instanciade laclaseClass.Este capítulo le explicas todas las funciones principales asociadas con el objeto orientado a Ruby.

Clase se utiliza para formar el objeto especificado, que combina la representación de datos y métodos para organizar los datos en un paquete ordenado. datos y métodos de clase son llamados miembros de la clase.

definición de clase de rubí

Cuando se define una clase, en realidad se define un modelo para un tipo de datos. En realidad, esto no define ningún dato, pero la definición de lo que el nombre de los medios de clase, es decir, la definición de lo que constituye un objeto de la clase será, y qué acciones puede llevar a cabo en el objeto.

definición de la clase comienza con laclase de palabras clave,seguido por elnombre de la clase,y finalmenteterminacon una representación separada restringir tales definiciones. Por ejemplo, se utiliza la palabra clave class para definir la clase Box, de la siguiente manera:

class Box
   code
end

Por convención, el nombre debe comenzar con una letra mayúscula, si contiene más de una palabra, en mayúscula la primera letra de cada palabra, pero aquí hay delimitador (por ejemplo: CamelCase).

Definiciones de objetos de rubí

Clase proporciona el modelo para un objeto, lo que, básicamente, el objeto se crea de acuerdo con la clase. Utilizamos la palabra clavenew para declarar la clase de objeto.La siguiente sentencia declara la clase Box dos objetos:

box1 = Box.new
box2 = Box.new

inicializar método

inicializar método es un método de clase estándar de Ruby es el constructor de la clase, similar a otras obras constructorlenguajes de programación orientados a objetos. Cuando desea inicializar algunas variables en la clase para crear un objeto al mismo tiempo, inicializar método es muy útil. El método tiene una serie de argumentos, como otros métodos de rubí, utilizando este método, debe ser colocado en frente dela palabra clave def,como sigue:

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

Las variables de instancia

variables de instancia de clase de la propiedad es que se crean cuando se utiliza la clase de objeto se convertirá en propiedad del objeto.Las propiedades individuales de cada objeto se le asigna, entre otros objetos, y no comparten los valores. Dentro de la clase es utilizar el operador @ para acceder a esas propiedades fuera de la clase, escomún el uso deun método llamadosmétodos de accesode acceso. Aquí definimos la claseBox arriba como ejemplo, la caja @width clase y @height como variables de instancia.

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

Los descriptores de acceso (de acceso) y setter método (setter)

Con el fin de utilizar las variables externas de la clase, hay que definir estas variables en losmétodos de acceso interno,de acceso es elcaptador equivalente.El siguiente ejemplo demuestra el método de acceso:

#!/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}"

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

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

Similar a los métodos de acceso utilizados para acceder a los valores de las variables, Ruby proporciona una manera de fijar el valor externo variable de la clase A, también conocido comométodo setter, definido como sigue:

#!/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}"

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

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

Métodos de instancia

Definirlos métodos de instancia y otros métodos definidos, que están utilizando la palabra clave def,pero sólo pueden ser utilizados por una instancia de clase, como se muestra en los siguientes ejemplos. Su función no se limita a acceder a las variables de instancia, sino también de acuerdo a sus necesidades para hacer más otras tareas.

#!/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}"

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

Area of the box is : 200

métodos de clase y variables de clase

Las variables de clase son todas las instancias de una variables de clase compartida.En otras palabras, las variables de instancia de clase se puede acceder a todas las instancias de objetos. variable de clase con dos caracteres @ (@@) como prefijo, las variables de clase deben ser inicializadas en la definición de clase, como se muestra en los siguientes ejemplos.

método de la clase defdefiniciónself.methodname (),un método de clase para terminar delimitador. Los métodos de clase se pueden utilizar con la forma del nombre de la claseclassname.methodname llamada, como se muestra en los siguientes ejemplos:

#!/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()

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

Box count is : 2

método to_s

Cualquier clase tiene un método de instanciato_s que se defina para devolver una representación de cadena del objeto.Aquí está un ejemplo sencillo, de acuerdo con la anchura y la altura representan objetos de la caja:

#!/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}"

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

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

control de Acceso

Rubí le proporciona tres niveles de protección de los métodos de instancia, que sonpúblicas, privadas o protegidas.Cualquier aplicación de control de acceso no está en las variables de instancia y de clase Ruby.

  • Método público: Los métodos públicosse puede llamar cualquier objeto. De forma predeterminada, los métodos son públicos, excepto por el método initialize es siempre privada.
  • Métodos particulares: métodos privadosno se puede acceder ni verse desde fuera de la clase. métodos de clase sólo pueden tener acceso a los miembros privados.
  • Método protegido: Método protegidosólo se puede llamar una clase de objeto y sus subclases. El acceso sólo puede llevarse a cabo en una clase interna y sus subclases.

Aquí está un ejemplo simple que muestra la sintaxis de tres modificador:

#!/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()

Cuando se ejecuta el código de seguridad, se producen los siguientes resultados. En este caso, la primera llamada al método tiene éxito, pero el segundo método tendrá un problema.

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

la herencia de clases

La herencia, la programación orientada a objetos es uno de los conceptos más importantes. La herencia nos permite definir una clase basada en otra clase, lo que hace que la creación y el mantenimiento de aplicaciones mucho más fácil.

La herencia ayuda a reutilizar código y una rápida ejecución, por desgracia, Ruby no soporta herencia múltiple, peromixins apoyo Ruby.mixin es como una aplicación particular de la herencia múltiple, la herencia múltiple, sólo una parte de la interfaz es heredable.

Cuando se crea una clase, el programador puede especificar una nueva clase que hereda de una clase existente de los miembros, por lo que no escribir desde cero los nuevos miembros de datos y las funciones miembro. La clase existente se llama laclase base o clase padre, la nueva clase se llama las clases o subclases derivadas.

Rubí también proporciona una subclase subclase concepto que se hereda, el siguiente ejemplo ilustra este concepto. La extensión de una sintaxis clase es muy simple. Sólo tiene que añadir un <nombre del personaje y de la clase padre de la lata declaración de clase. Por ejemplo, la siguiente define una claseBigBoxBox es una subclase:

#!/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()

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

Big box area is : 200

La sobrecarga de métodos

Aunque se pueden añadir nuevas características en una clase derivada, pero a veces es posible que desee cambiar el comportamiento ha sido definido en los métodos de la clase padre. A continuación, puede mantener el mismo nombre de método, la función se puede sobrecargar métodos, como se muestra en los siguientes ejemplos:

#!/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()

Ejecutar la salida anterior ejemplo es:

Big box area is : 200

La sobrecarga de operadores

Queremos utilizar el operador + realiza una suma vectorial de dos objetos de la caja, utilice el operador * a la anchura y la altura de la caja multiplicada usando operador unario - la anchura y la altura de la caja negados. He aquí una versión de la clase de matemáticas con la definición 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

objeto congelado

A veces, queremos evitar que se cambia un objeto. En el objeto, método de congelación puede lograr esto, se puede efectivamente poner un objeto en una constante. Cualquier objeto puede ser congelado llamandoObject.freeze.objeto congelado no puede ser modificado, es decir, que no puede cambiar sus variables de instancia.

Puede utilizarObject.frozen? Método para comprobar si un objeto dado ha sido congelado.Si el objeto se ha congelado, el método devuelve true, en caso contrario devuelve un valor falso. El siguiente ejemplo ilustra este concepto:

#!/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}"

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

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

constantes de clases

Se puede definir una clase interna constante, por un valor numérico o de cadena directo a una definición de variable, que no requiere el uso constante @ o @@. Por convenio, el nombre del uso mayúsculas constante.

Una vez que se define una constante, no puede cambiar su valor, se puede acceder directamente a las constantes internas en la clase, como es el acceso a la misma variable, pero si desea acceder a la constante de clase externa, entonces debe utilizar elnombre de clase :: constante, como se muestra en los siguientes ejemplos.

#!/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}"

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

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

constantes de clase pueden ser heredados, sino también los mismos que se sobrecarga el método de instancia.

Utilice allocate crear objetos

Puede haber un caso, que desea crear un objeto sin tener que llamar al constructorinicializa el objeto, se crea ese objeto con el nuevo método, en este caso, puede llamar a asignar para crear un objeto no inicializado, como los siguientes ejemplos como sigue:

#!/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}"

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

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

Información de la clase

auto y Java de Ruby ello son similares, pero diferentes. los métodos de Java se hace referencia en un método de instancia, por lo que esta por lo general se refiere al objeto actual. La línea de código Ruby por línea, por lo que en un contexto de auto diferente (contexto) tiene un significado diferente. Vamos a echar un vistazo a los siguientes ejemplos:

#!/usr/bin/ruby -w

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

Cuando se ejecuta el código anterior, producirá los siguientes resultados:

Class of self = Class
Name of self = Box

Esto significa que la clase puede ser definida por la clase que el objeto actual de ejecutar, sino que también significa que los meta-clase y la definición del método de la clase padre durante la ejecución del proceso está disponible.