Ruby orientada a objeto
Ruby é uma linguagem orientada a objetos pura, Ruby, tudo é na forma de objetos. Cada valor em Ruby é um objeto, mesmo a coisa mais primitiva: Cordas, números e até mesmo o verdadeiro eo falso são objetos. A classe em si é umobjeto queé uma instânciadaclasseClass.Este capítulo diz-lhe explicar todas as principais funções associadas com o objeto orientada Ruby.
Classe é usada para formar o objeto especificado, que combina representação de dados e métodos para organizar dados em um pacote puro. dados e métodos de classe são chamados os membros da classe.
definição de classe de Ruby
Quando você define uma classe, você realmente definir um modelo para um tipo de dados. Isso realmente não define quaisquer dados, mas a definição do que o nome dos meios de classe, isto é, a definição do que constitui um objeto da classe será, e quais ações podem ser executadas no objeto.
definição de classe começa com a palavra-chaveclass, seguido pelo nomedaclasse,e, finalmente,terminarcom uma representação separada reduzir tais definições. Por exemplo, usamos a palavra-chave class para definir a classe Box, como segue:
class Box code end
Por convenção, o nome deve começar com uma letra maiúscula, se contiver mais de uma palavra, capitalizar a primeira letra de cada palavra, mas aqui não é delimitador (por exemplo: CamelCase).
definições de objetos de Ruby
Classe fornece o modelo para um objeto, então, basicamente, o objeto é criado de acordo com a classe. Usamos anova palavra-chave para declarar o objeto de classe.A declaração a seguir declara a caixa de classe dois objetos:
box1 = Box.new box2 = Box.new
método de inicializar
método deinicializar é um método padrão de classe Ruby é o construtor da classe, similar a outras obras do construtorlinguagens de programação orientada a objeto. Quando você quiser inicializar algumas variáveis na classe para criar um objeto ao mesmo tempo, inicializar método vem a calhar. O método tem uma série de argumentos, assim como outros métodos Ruby, usando este método, deve ser colocada na frenteda chave DEF,como segue:
class Box def initialize(w,h) @width, @height = w, h end end
variáveis de instância
variáveis de instância de classe de propriedade é que eles criam ao usar o objeto de classe vai se tornar propriedade do objeto.propriedades individuais de cada objeto é atribuído, entre outros objetos, e não compartilham valores. Dentro da classe é usar o operador @ para acessar essas propriedades fora da classe, écomum a utilização deum método chamadométodos de acessode acesso. Aqui definimos oBox classe acima como um exemplo, o @largura classe Box e @height como variáveis de instância.
class Box def initialize(w,h) # 给实例变量赋值 @width, @height = w, h end end
Acessores (acessor) & setter método (setter)
Para utilizar variáveis externas da classe, devemos definir essas variáveis nosmétodos de acesso internos,acessor é ogetter equivalente.O seguinte exemplo demonstra o método de acesso:
#!/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}"
Quando o código acima é executado, ele irá produzir os seguintes resultados:
Width of the box is : 10 Height of the box is : 20
Similar aos métodos de acesso usados para acessar os valores das variáveis, Ruby fornece uma maneira de definir o valor externo variável da classe A, também conhecido comométodo setter, definido como segue:
#!/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}"
Quando o código acima é executado, ele irá produzir os seguintes resultados:
Width of the box is : 30 Height of the box is : 50
Métodos da instância
Definiros métodos de instância e outros métodos definidos, estão a utilizar a palavra-chave DEF,mas só pode ser usado por uma instância da classe, tal como mostrado nos exemplos seguintes. Sua função não se limita a acessar variáveis de instância, mas também de acordo com suas necessidades de fazer mais outras tarefas.
#!/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}"
Quando o código acima é executado, ele irá produzir os seguintes resultados:
Area of the box is : 200
métodos de classe de classe variáveis &
Variáveis de classe são todas as instâncias de uma classe compartilhada variáveis.Em outras palavras, as variáveis de instância de classe pode ser acessado de todas as instâncias de objetos. variável de classe, com dois caracteres @ (@@) como um prefixo, variáveis de classe deve ser inicializado na definição de classe, como mostrado nos exemplos a seguir.
método de classe def self.methodname ()definição, um método de classe para terminar delimitador. Métodos de classe pode ser utilizada com a forma nome de classeclassname.methodname da chamada, como mostrado nos exemplos seguintes:
#!/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()
Quando o código acima é executado, ele irá produzir os seguintes resultados:
Box count is : 2
método to_s
Qualquer classe tem um método de instânciato_s que você define para retornar uma representação de string do objeto.Aqui está um exemplo simples, de acordo com a largura e altura representam objetos 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}"
Quando o código acima é executado, ele irá produzir os seguintes resultados:
String representation of box is : (w:10,h:20)
Controle de acesso
Rubi oferece três níveis de métodos de instância de proteção, que sãopública, privada ou protegida.Qualquer aplicação de controle de acesso não está na instância e de classe variáveis Ruby.
- Método público: métodos públicospode ser chamado de qualquer objeto. Por padrão, os métodos são públicos, exceto para o método initialize é sempre privado.
- Métodos privados: métodos privadosnão pode ser acessado ou visto de fora da classe. Apenas métodos de classe podem acessar membros privados.
- Método protegido: Protected método só pode ser chamado de uma classe de objeto e suas subclasses.O acesso apenas pode ser realizada em uma classe interna e suas subclasses.
Aqui está um exemplo simples que demonstra a sintaxe de três 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()
Quando o código acima é executado, ele irá produzir os seguintes resultados. Aqui, a primeira chamada de método tiver êxito, mas o segundo método terá um problema.
Area of the box is : 200 test.rb:42: protected method `printArea' called for # <Box:0xb7f11280 @height=20, @width=10> (NoMethodError)
A herança de classe
Herança, programação orientada a objetos é um dos conceitos mais importantes. Herança nos permite definir uma classe com base em outra classe, o que torna a criação e manutenção de aplicações muito mais fácil.
Herança ajuda a reutilização de código e execução rápida, infelizmente, Ruby não suporta herança múltipla, masmixins suporte Ruby.mixin é como uma implementação específica de herança múltipla, herança múltipla, apenas uma parte da interface é hereditária.
Quando você cria uma classe, o programador pode especificar uma nova classe que herda de uma classe existente de membros, por isso não escrever a partir do zero os novos membros de dados e funções de membro. A classe existente é chamada declasse base ou classe pai, a nova classe é chamado as classes derivadas ou subclasses.
Rubi também fornece uma subclasse conceito subclasse que é herdada, o seguinte exemplo ilustra esse conceito. Estendendo uma sintaxe classe é muito simples. Basta adicionar um <nome do personagem e da classe pai para a lata declaração de classe. Por exemplo, a seguir define uma classeBigBoxBox é uma subclasse:
#!/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()
Quando o código acima é executado, ele irá produzir os seguintes resultados:
Big box area is : 200
sobrecarga de método
Embora seja possível adicionar novos recursos em uma classe derivada, mas às vezes você pode querer mudar o comportamento foi definido nos métodos da classe pai. Em seguida, é possível manter o mesmo nome de método, a função pode ser sobrecarregado métodos, como mostrado nos exemplos seguintes:
#!/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()
Execute o exemplo acima saída é:
Big box area is : 200
sobrecarga de operadores
Queremos usar o operador + realiza a adição do vetor de dois objetos da caixa, use o operador * para a largura e altura da caixa multiplicado usando operador unário - a largura e altura da caixa negada. Aqui está uma versão da aula de matemática com a definição 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
Às vezes, queremos evitar que um objeto é alterado. No objeto, método de congelamento pode conseguir isso, ele pode efetivamente colocar um objeto em uma constante. Qualquer objeto pode ser congelado chamandoObject.freeze.objeto congelado não pode ser modificada, ou seja, você não pode mudar suas variáveis de instância.
Você pode usarObject.frozen? Método para verificar se um determinado objeto foi congelado.Se o objeto foi congelada, o método retorna true, caso contrário, ele retorna um valor falso. O exemplo a seguir ilustra esse conceito:
#!/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}"
Quando o código acima é executado, ele irá produzir os seguintes resultados:
Box object is frozen object test.rb:20:in `setWidth=': can't modify frozen object (TypeError) from test.rb:39
constantes de classe
Você pode definir uma classe interna constante, por um valor numérico ou string directo a uma definição de variável, que não requer o uso @ constante ou @@. Por convenção, o nome do maiúsculas uso constante.
Uma vez que uma constante é definida, você não pode mudar o seu valor, você pode acessar diretamente as constantes internas na classe, assim como o acesso à mesma variável, mas se você quiser acessar constante de classe externo, então você deve usar onome da classe :: constante, como mostrado nos exemplos seguintes.
#!/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}"
Quando o código acima é executado, ele irá produzir os seguintes resultados:
Area of the box is : 200 TATA Inc Box weight is: 10
constantes de classe pode ser herdada, mas também o mesmo que o método de instância está sobrecarregado.
Use alocar criar objetos
Pode haver um caso, você quer criar um objeto sem chamar o construtorinicializar o objeto, esse objeto é criado usando o novo método, neste caso, você pode chamar alocar para criar um objeto não inicializado, como os exemplos a seguir como se segue:
#!/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}"
Quando o código acima é executado, ele irá produzir os seguintes 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
Informações classe
auto e Java Ruby isso são semelhantes, mas diferentes. métodos Java são referenciados em um método de instância, de modo que este geralmente se refere ao objeto atual. A linha de código Ruby por linha, por isso em um contexto (contexto) auto diferente ter um significado diferente. Vamos dar uma olhada nos seguintes exemplos:
#!/usr/bin/ruby -w class Box # 输出类信息 puts "Class of self = #{self.class}" puts "Name of self = #{self.name}" end
Quando o código acima é executado, ele irá produzir os seguintes resultados:
Class of self = Class Name of self = Box
Isto significa que a classe pode ser definido pela classe como o objeto atual de executar, mas também significa que meta-classe e a definição do método da classe pai durante a execução do processo está disponível.