Latest web development tutorials

Ruby-Objekt-orientierte

Ruby ist eine rein objektorientierte Sprache, Ruby, alles in Form von Objekten ist. Jeder Wert in Ruby ist ein Ziel, auch die primitive Sache: Strings, Zahlen und sogar wahr und falsch sind Objekte. Die Klasse selbst ist einObjekt,daseine Instanzder KlasseKlasse ist. In diesem Kapitel erfahren Sie alle wichtigen Funktionen erklären mit der Ruby objektorientierten verbunden.

Klasse wird verwendet, um das angegebene Objekt zu bilden, die Datendarstellung und Methoden kombiniert Daten in ein ordentliches Paket zu organisieren. Klassendaten und Methoden sind Mitglieder der Klasse genannt.

Ruby-Klasse Definition

Wenn Sie eine Klasse definieren, definieren Sie eigentlich einen Entwurf für einen Datentyp. Dies gilt definieren tatsächlich keine Daten, sondern die Definition dessen, was der Name der Klasse Mittel, das heißt, von der Definition, was als ein Objekt der Klasse sein wird, und welche Aktionen auf dem Objekt durchgeführt werden.

Klassendefinition beginnt mit dem Schlüsselwort -Klasse, die von dem Klassennamen gefolgt,und schließlich mit einer getrennten Darstellung beschneiden solche Definitionenbeenden.Zum Beispiel verwenden wir die Klasse Schlüsselwort, um die Box-Klasse zu definieren, wie folgt:

class Box
   code
end

Vereinbarungsgemäß muss der Name mit einem Großbuchstaben beginnen, wenn es mehr als ein Wort enthält, nutzen Sie den ersten Buchstaben jedes Wortes, aber hier ist kein Trennzeichen (zB: Camelcase).

Ruby-Objektdefinitionen

Klasse liefert den Bauplan für ein Objekt, so dass im Grunde, das Objekt in Übereinstimmung mit der Klasse erstellt wird. Wir verwenden dasneue Schlüsselwort das Klassenobjekt zu erklären.Die folgende Anweisung deklariert die Klasse Box zwei Objekte:

box1 = Box.new
box2 = Box.new

initialisieren Verfahren

initialisieren Methode ist eine Standard - Ruby - Klasse Methode der Konstruktor der Klasse ist, ähnlich wie in anderen objektorientierten Programmiersprachen Konstruktorfunktioniert. Wenn Sie einige Variablen in der Klasse zu initialisieren wollen ein Objekt in der gleichen Zeit zu erstellen, initialisieren Methode kommt in handliches. Das Verfahren nimmt eine Reihe von Argumenten, wie andere Ruby - Methoden, diese Methode verwenden, muss es vordem Schlüsselwort defplatziert werden, wie folgt:

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

Instanzvariablen

Objektklasseninstanz Variablen ist , dass sie zu erstellen , wenn die Objektklasse verwendet , wird Eigenschaft des Objekts.Einzelne Eigenschaften jedes Objekt zugeordnet ist, unter anderem Objekte und keine Werte teilen. Innerhalb der Klasse den Operator @ verwenden ist , diese Eigenschaften außerhalb der Klasse zugreifen zu können , ist esüblich , eine Methode namens Zugriffsmethodendes Zugangs zu verwenden. Hier definieren wir die KlasseBox oben als Beispiel, die Klasse Box @width und @height als Instanzvariablen.

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

Accessoren (Accessor) & Setter (Setter) Methode

Um externen Variablen der Klasse zu verwenden, wir diese Variablen in den internenZugriffsmethodendefinierenmüssen,Accessor ist das ÄquivalentGetter.Das folgende Beispiel zeigt die Accessor-Methode:

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

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

Ähnlich wie bei den Zugriffsmethoden verwendet , um die Variablenwerte zugreifen zu können , bietet Ruby eine Möglichkeit , die variable Außenwert der Klasse A zu setzen, die auch alsSet - Methode bekannt,wie folgt definiert:

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

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

Beispiel Methods

Definieren SieInstanzmethoden und andere Methoden definiert, sie das Schlüsselwort defverwenden, aber sie können nur durch eine Instanz der Klasse verwendet werden, wie in den folgenden Beispielen gezeigt. Ihre Funktion ist nicht auf Instanzvariablen zugreifen zu können, sondern auch nach Ihren Bedürfnissen mehr andere Aufgaben zu tun.

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

Area of the box is : 200

Klassenvariablen Klassenmethoden &

Klassenvariablen sind alle Instanzen einer Klasse gemeinsam genutzte Variablen.Mit anderen Worten können die Klasseninstanzvariablen alle Objektinstanzen zugegriffen werden. Klassenvariable mit zwei @ -Zeichen (@@) als Präfix, Klasse Variablen müssen in der Klassendefinition initialisiert werden, wie in den folgenden Beispielen gezeigt.

Klasse Methode def self.methodname ()Definition, eine Klassenmethode zu Begrenzer beenden. Klassenmethoden können mit dem Klassennamenclassname.methodname Form Anrufs verwendet werden, wie in den folgenden Beispielen gezeigt:

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

Box count is : 2

to_s Verfahren

Jede Klasse hat eineto_s Instanz - Methode , die Sie definieren eine String - Darstellung des Objekts zurückzukehren.Hier ist ein einfaches Beispiel, entsprechend der Breite und Höhe repräsentieren Box-Objekte:

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

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

Access Control

Rubin bietet Ihnen drei Schutzebenen Instanzmethoden, dieöffentlich sind, privat oder geschützt.Jede Zugangskontrollanwendung ist nicht auf Ruby-Instanz und Klassenvariablen.

  • Öffentliche Methode: Öffentliche Methoden kann jedes Objekt aufgerufen werden.Standardmäßig sind die Methoden öffentlich, mit Ausnahme der Methode initialize immer privat.
  • Private Methoden: Private Methoden können nicht von außerhalb der Klasse zugegriffen oder eingesehen werden.Nur Klassenmethoden können private Mitglieder zugreifen.
  • Geschützte Methode: Geschützte Methode kann nur eine Objektklasse und ihrer Unterklassen aufgerufen werden.Der Zugriff kann nur in einem internen Klasse und ihre Unterklassen durchgeführt werden.

Hier ist ein einfaches Beispiel, das die drei Modifikator Syntax zeigt:

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse. Hier gelingt es der erste Methodenaufruf, aber die zweite Methode wird ein Problem haben.

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

Klassenvererbung

Vererbung, die objektorientierte Programmierung ist eine der wichtigsten Konzepte. Die Vererbung ermöglicht es uns, eine Klasse zu definieren, basierend auf einer anderen Klasse, die macht das Erstellen und Pflege von Anwendungen viel einfacher.

Vererbung hilft Code und schnelle Ausführung wieder zu verwenden, leider hat Rubin keine Mehrfachvererbung unterstützen, aber Ruby - UnterstützungMixins.mixin ist wie eine spezielle Implementierung von Mehrfachvererbung, Mehrfachvererbung, nur einen Teil der Schnittstelle vererbbar ist.

Wenn Sie eine Klasse zu erstellen, kann der Programmierer eine neue Klasse angeben, die von einer vorhandenen Klasse von Mitgliedern erbt, so schreiben Sie nicht von Grund auf neu Funktionen, die neuen Datenelemente und Mitglied. Die bestehende Klasse ist dieBasisklasse oder Elternklasse bezeichnet wird ,wird die neue Klasse derabgeleiteten Klassen oder Unterklassen genannt.

Rubin bietet auch eine Unterklasse Konzept Unterklasse, die vererbt wird, wird das folgende Beispiel illustriert dieses Konzept. eine Klasse Syntax Erweiterung ist sehr einfach. Fügen Sie einfach einen <Charakternamen und die Elternklasse der Klasse Anweisung kann. Zum Beispiel definiert die folgende eine KlasseBigBoxBox ist eine Unterklasse:

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

Big box area is : 200

Methode Überlastung

Sie können zwar neue Funktionen in einer abgeleiteten Klasse hinzuzufügen, aber manchmal können Sie das Verhalten ändern möchten wurde in der übergeordneten Klasse Methoden definiert. Dann können Sie die gleiche Methode Namen behalten, kann die Funktion Methoden überlastet werden, wie in den folgenden Beispielen gezeigt:

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

Führen Sie das obige Beispiel Ausgabe lautet:

Big box area is : 200

Überladen von Operatoren

Wir wollen, dass der Operator + Vektor zu verwenden Addition von zwei Box-Objekte führt, verwenden Sie den Operator * auf die Breite und Höhe des Box multipliziert einstellige Operator - die Breite und Höhe der Box negiert. Hier ist eine Version der Mathematik Klasse mit Box Operator Definition:

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

Gefrorene Objekt

Manchmal wollen wir ein Objekt zu verhindern geändert wird. Im Objekt kann Freeze-Verfahren erreichen, kann es effektiv ein Objekt in eine Konstante setzen. Jedes Objekt kann durch den Aufruf vonObject.freeze eingefroren werden.Gefrorene Objekt kann nicht geändert wird, werden, kann man nicht seine Instanzvariablen ändern.

Sie könnenObject.frozen? Methode , um zu überprüfen , ob ein bestimmtes Objekt eingefroren wurde.Wenn das Objekt eingefroren wurde, gibt die Methode true, sonst wird es einen falschen Wert zurückgibt. Das folgende Beispiel veranschaulicht dieses Konzept:

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

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

Klasse Konstanten

Sie können eine konstante interne Klasse, durch eine direkte numerische oder String-Wert zu einer Variablendefinition definieren, die nicht den ständigen Gebrauch @ erfordert oder @@. Vereinbarungsgemäß wird der Name des ständigen Gebrauch groß geschrieben.

Sobald eine Konstante definiert ist, können Sie ihren Wert nicht ändern, Sie direkt die internen Konstanten in der Klasse zugreifen können, da der Zugriff auf die gleiche Variable ist, aber wenn Sie externe konstante Klasse zugreifen möchten, müssen Sie denKlassennamen verwenden :: constant, wie in den folgenden Beispielen gezeigt.

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

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

Klasse Konstanten können vererbt werden, sondern auch die gleiche wie die Instanzmethode überlastet ist.

Verwenden Sie zurechnen Objekte erstellen

Es kann der Fall sein, möchten Sie ein Objekt zu erstellen , ohne dass der Konstruktorinitialisieren das Objekt aufgerufen wird , das Objekt erstellt wird die neue Methode verwenden, in diesem Fall können Sie einen nicht initialisierten Objekt zu erstellen, wie die folgenden Beispiele nennen zuweisen wie folgt:

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

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

Klasseninformationen

Ruby selbst und Java dies sind ähnlich, aber anders. Java-Methoden werden in einer Instanz-Methode verwiesen, so bezieht sich dies in der Regel auf das aktuelle Objekt. Der Ruby-Code Zeile für Zeile, also in einem anderen Kontext (Kontext) selbst haben eine andere Bedeutung. Schauen wir uns die folgenden Beispiele einen Blick:

#!/usr/bin/ruby -w

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

Wenn der obige Code ausgeführt wird, wird es die folgenden Ergebnisse erzielt:

Class of self = Class
Name of self = Box

Das bedeutet, dass die Klasse kann durch die Klasse als das aktuelle Objekt definiert werden, auszuführen, sondern bedeutet auch, dass Meta-Klasse und die Methodendefinition übergeordneten Klasse während der Prozessausführung zur Verfügung.