Latest web development tutorials

Rubino object-oriented

Ruby è un linguaggio orientato agli oggetti puro, Ruby, tutto è in forma di oggetti. Ogni valore in Ruby è un oggetto, anche la cosa più primitiva: stringhe, numeri, e anche vero e falso sono oggetti. La classe è di per sé unoggetto cheè un'istanzadellaclassedi classe.Questo capitolo spiega spiegare tutte le principali funzioni associate con l'oggetto-oriented Ruby.

Classe viene utilizzata per formare l'oggetto specificato, che combina la rappresentazione di dati e metodi per organizzare i dati in un pacchetto accurato. i dati di classe e metodi sono chiamati i membri della classe.

definizione di classe Rubino

Quando si definisce una classe, in effetti si definisce un modello per un tipo di dati. Questo in realtà non definisce alcun dato, ma la definizione di ciò che il nome del mezzo di classe, vale a dire, la definizione di ciò che costituisce un oggetto della classe sarà, e quali azioni possono essere eseguite sull'oggetto.

Definizione della classe inizia con la parola chiaveclass, seguita dal nomedellaclasse,e, infine,terminacon una rappresentazione separata limitare tali definizioni. Ad esempio, si usa la parola chiave class per definire la classe di sicurezza, come segue:

class Box
   code
end

Per convenzione, il nome deve iniziare con una lettera maiuscola, se contiene più di una parola, in maiuscolo la prima lettera di ogni parola, ma qui non è delimitatore (ad esempio: CamelCase).

definizioni degli oggetti di Ruby

Class fornisce il modello per un oggetto, in modo sostanzialmente, l'oggetto viene creato in conformità con la classe. Usiamo lanuova parola chiave per dichiarare l'oggetto della classe.La seguente dichiarazione dichiara casella Classe due oggetti:

box1 = Box.new
box2 = Box.new

metodo di inizializzazione

metodo diinizializzazione è un metodo di classe standard di Ruby è il costruttore della classe, simile ad altri linguaggi di programmazione orientati agli oggetti opere di costruzione.Quando si desidera inizializzare alcune variabili nella classe per creare un oggetto, allo stesso tempo, l'inizializzazione metodo è utile. Il metodo richiede una serie di argomenti, come altri metodi rubino, con questo metodo, deve essere posto davantialla parola chiave def,come segue:

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

Le variabili di istanza

variabili di proprietà di istanzadi classe è che essi creano quando si utilizza l'oggetto di classe diventerà proprietà dell'oggetto. le proprietà individuali di ogni oggetto è assegnato, tra gli altri oggetti, e non condividono i valori. All'interno della classe è di utilizzare l'operatore @ per accedere a tali proprietà all'esterno della classe, ècomune utilizzare un metodo chiamato metodi di accessodi accesso. Qui si definisce ilBox classe superiore come esempio, il @width classe Box e @height come variabili di istanza.

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

Metodo di accesso (di accesso) e setter (setter)

Per poter utilizzare le variabili esterne della classe, dobbiamo definire queste variabili neimetodi di accesso interni,di accesso è ilgetter equivalente.L'esempio seguente dimostra il metodo di accesso:

#!/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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

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

Analogamente ai metodi di accesso utilizzate per accedere ai valori delle variabili, Ruby fornisce un modo per impostare il valore esterno variabile della classe A, noto anche comemetodo setter, definita come 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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

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

Metodi di istanza

Definiremetodi di istanza e altri metodi definiti, che stanno utilizzando la parola chiave def,ma possono essere utilizzati solo da un'istanza di classe, come illustrato negli esempi seguenti. La loro funzione non è limitata per accedere variabili di istanza, ma anche in base alle proprie esigenze di fare di più altri compiti.

#!/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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

Area of the box is : 200

I metodi di classe di classe variabili &

le variabili di classe sono tutte le istanze di un variabili di classe condivisa.In altre parole, le variabili di istanza classe sono accessibili tutte le istanze di oggetti. variabile di classe con due @ caratteri (@@) come prefisso, variabili di classe devono essere inizializzate nella definizione della classe, come illustrato negli esempi che seguono.

metodo di classe def self.methodname ()definizione, un metodo di classe alla fine delimitatore. I metodi di classe possono essere utilizzati con il modulo nome della classeclassname.methodname di chiamata, come illustrato nei seguenti esempi:

#!/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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

Box count is : 2

metodo to_s

Ogni classe ha un metodo di istanzato_s che si definisce per restituire una rappresentazione in formato stringa dell'oggetto.Ecco un semplice esempio, in base alla larghezza e altezza rappresentano oggetti di sicurezza:

#!/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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

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

Access Control

Rubino vi offre tre livelli di protezione metodi di istanza, che sonopubblici, privati o protetti.Qualsiasi applicazione di controllo di accesso non è su Ruby istanza e di classe variabili.

  • Metodo pubblico: metodi pubblicipuò essere chiamato qualsiasi oggetto. Per default, i metodi sono pubblici, eccetto per il metodo initialize è sempre privato.
  • Metodi privati: i metodi privatinon sono accessibili o viste dall'esterno della classe. Solo i metodi della classe possono accedere ai membri privati.
  • Metodo protetto: Metodo protettopuò essere chiamato solo una classe di oggetti e le sue sottoclassi. L'accesso può essere effettuato solo in una classe interna e le sue sottoclassi.

Ecco un semplice esempio che dimostra la sintassi tre modificatore:

#!/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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati. Qui, la prima chiamata di metodo riesce, ma il secondo metodo avrà un problema.

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

eredità di classe

Ereditarietà, programmazione orientata agli oggetti è uno dei concetti più importanti. L'ereditarietà consente di definire una classe basata su un'altra classe, il che rende la creazione e la gestione di applicazioni molto più facile.

L'ereditarietà consente di riutilizzare il codice e l'esecuzione veloce, purtroppo, Ruby non supporta l'ereditarietà multipla, mamixins supporto Ruby.mixin è come una particolare implementazione dell'ereditarietà multipla, l'ereditarietà multipla, solo una parte della interfaccia è ereditabile.

Quando si crea una classe, il programmatore può specificare una nuova classe che eredita da una classe esistente di membri, in modo da non scrivere da zero i nuovi membri di dati e le funzioni membro. La classe esistente è chiamata laclasse di base o classe genitore,la nuova classe si chiama leclassi o sottoclassi derivate.

Rubino offre anche una sottoclasse concetto di sottoclasse che viene ereditata, il seguente esempio illustra questo concetto. Estendendo una sintassi classe è molto semplice. Basta aggiungere un <nome del personaggio e la classe genitore per la lattina dichiarazione di classe. Ad esempio, il seguente definisce una classeBigBoxBox è una sottoclasse:

#!/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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

Big box area is : 200

metodo sovraccarico

Anche se è possibile aggiungere nuove funzionalità in una classe derivata, ma a volte si può decidere di modificare il comportamento è stato definito nei metodi della classe genitore. Quindi è possibile mantenere lo stesso nome del metodo, la funzione può essere sovraccaricato metodi, come illustrato nei seguenti esempi:

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

Eseguire l'uscita precedente esempio è il seguente:

Big box area is : 200

L'overloading degli operatori

Vogliamo usare l'operatore + esegue vettore aggiunta di due oggetti di sicurezza, utilizzare l'operatore * per la larghezza e l'altezza del Box moltiplicato usando operatore unario - la larghezza e l'altezza del Box negati. Ecco una versione della classe di matematica con la definizione 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

oggetto congelata

A volte, si vuole evitare che un oggetto viene modificato. Nel oggetto, metodo di congelamento può raggiungere questo obiettivo, si può effettivamente mettere un oggetto in una costante. Qualsiasi oggetto può essere congelato chiamandoObject.freeze.oggetto congelato non può essere modificato, vale a dire, non è possibile modificare le sue variabili di istanza.

È possibile utilizzareObject.frozen? Metodo per verificare se un determinato oggetto è stato congelato.Se l'oggetto è stato congelato, il metodo restituisce vero, altrimenti restituisce un valore falso. L'esempio seguente illustra questo concetto:

#!/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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

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

costanti di classe

È possibile definire una classe interna costante, da un valore numerico o una stringa diretto ad una definizione della variabile, che non richiede l'uso costante @ o @@. Per convenzione, il nome del l'uso maiuscolo costante.

Una volta che una costante è definita, non è possibile modificare il suo valore, è possibile accedere direttamente alle costanti interne nella classe, così come l'accesso alla stessa variabile, ma se si desidera accedere costante di classe esterno, quindi è necessario utilizzare ilnome di classe :: costante , come mostrato negli esempi seguenti.

#!/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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

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

Costanti di classe possono essere ereditati, ma anche lo stesso del metodo di istanza è sovraccarico.

Utilizzare allocate creare oggetti

Ci può essere un caso, si desidera creare un oggetto senza chiamare il costruttoreinizializzare l'oggetto, l'oggetto viene creato utilizzando il nuovo metodo, in questo caso, è possibile chiamare allocare per creare un oggetto non inizializzato, come i seguenti esempi come 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 viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

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

Informazioni Class

auto e Java di Ruby questo sono simili, ma differenti. metodi Java si fa riferimento a un metodo di istanza, quindi questo di solito si riferisce all'oggetto corrente. La linea di codice Ruby per riga, quindi in un diverso contesto (context) auto hanno un significato diverso. Diamo uno sguardo ai seguenti esempi:

#!/usr/bin/ruby -w

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

Quando viene eseguito il codice di cui sopra, esso produrrà i seguenti risultati:

Class of self = Class
Name of self = Box

Ciò significa che la classe può essere definita dalla classe come oggetto corrente per eseguire, ma significa anche che meta-classe e la definizione di metodo classe padre durante l'esecuzione del processo è disponibile.