Welchen Einflussbereich hat die Vererbung während der Arbeit? .. Und Was bedeutet Selbst in diesem Fall? .. Und Ich konnte nur den Grundteil flauschig verstehen, also diesmal
--Klasse --Erbe - self --Nest
Ich habe beim Schreiben gelernt, also werde ich es als Aufzeichnung schreiben. Ich möchte über Methoden und Variablen schreiben, aber ich möchte sie separat schreiben, weil es lang zu sein scheint.
Sie können beim Definieren der Klasse eine Oberklasse angeben: Wenn dies zu diesem Zeitpunkt nicht angegeben ist, wird die Objektklasse automatisch vererbt. Wenn eine neue Klasse definiert wird, erbt sie daher eine Klasse. Es wird immer irgendwo im Vererbungsbaum sein.
Obwohl es nicht vererbt wird, können Sie auch auf Oberklassenkonstanten und Klassenvariablen verweisen.
class Klass
VALUE = "I'm VALUE"
@@class_val = "I'm class_val"
end
class A < Klass
end
class B < A
def self.display_bal
puts @@class_val
end
end
#Verweis auf Konstanten der Oberklasse
puts B::VALUE
# => I'm VALUE
#Vererbung von Klassenvariablen
B.display_val
# => I'm class_val
self
class Klass
# Klass
p self
# Klass
def (p self).class_method
puts "inner_class_method"
# Klass
p self
end
def instance_method
puts "inner_instance_method"
# <Klass:0x00007fa07e1a47c8>
p self
end
end
Klass.class_method
klass_instanse = Klass.new
klass_instanse.instance_method
Im folgenden Beispiel haben wir nur dann auf das "Instanzobjekt" verwiesen, wenn es innerhalb einer Instanzmethode verwendet wurde. Da sich "self", das beim Definieren einer Klassenmethode verwendet wird, auf ein Klassenobjekt bezieht, kann "self" von "self. Method name" direkt durch den Klassennamen angegeben werden. Wenn Sie eine Klasse definieren, z. B. die Verschachtelung von Klassen, können Sie sie in einer anderen Klasse verschachteln. Es gibt die folgenden zwei Muster als Definitionsmethode, aber einige Verhaltensweisen ändern sich.
#Schreiben Sie direkt in
class TopKlass
class Klass
end
end
## ------ ##
# ”::Verwenden
class TopKlass
end
class TopKlass::Klass
end
・ Beschreiben Sie direkt in Es bezieht sich auf die Konstanten in der Reihenfolge von sich selbst bis zur obersten Ebene. Der Fluss bezieht sich auf die oberste Ebene in der Reihenfolge von der nächsten zu sich selbst und schließlich auf die oberste Ebene.
VALUE = "Top level"
class TopKlass
VALUE = "in TopKlass"
class InnerKlass
def self.put_value
puts VALUE
end
end
end
TopKlass::InnerKlass.put_value
# => in TopKlass
・ Beschrieben mit einem Namespace Wenn es keine Konstante hat, verweist es auf die oberste Ebene und dann von dort in Richtung seiner Klasse.
VALUE = "Top level"
class TopKlass
VALUE = "in TopKlass"
end
class TopKlass::InnerKlass
def self.put_value
puts VALUE
end
end
TopKlass::InnerKlass.put_value
# => Top level
· Beschrieben in Da in jeder Hierarchie eine Klasse oder ein Modul angegeben ist, tritt ein Fehler auf, wenn ein separat definiertes Modul als Klasse angegeben wird.
module TopKlass
end
class TopKlass
class InnerKlass
end
end
# => TopKlass is not a class (TypeError)
・ Beschrieben mit einem Namespace Da nur die am Ende (ganz rechts) beschriebene angibt, ob es sich um eine Klasse handelt oder nicht Davon abgesehen macht es die Beurteilung von Klasse und Modul flexibel.
module TopKlass
end
class TopKlass::InnerKlass
end
#Kein Fehler
· Beschrieben in Im folgenden Beispiel, wenn TopKlass nicht separat definiert wurde Es tritt keine Ausnahme auf, da TopKlass neu definiert wurde.
class TopKlass
class InnerKlass
end
end
・ Beschrieben mit einem Namespace
In den folgenden Fällen wird eine Ausnahme ausgelöst, wenn TopKlass nicht separat definiert wird. Es wird keine neue TopKlass definiert.
class TopKlass::InnerKlass
end
# => uninitialized constant TopKlass (NameError)
Recommended Posts