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.