English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

面向对象 Ruby

Ruby est un langage orienté objet pur, tout dans Ruby apparaît sous la forme d'un objet. Chaque valeur en Ruby est un objet, même les choses les plus primitives : les chaînes, les nombres, même true et false sont des objets. La classe elle-même est aussi unun objetest Class Exemple de classe

La classe est utilisée pour spécifier la forme de l'objet, elle combine la représentation des données et les méthodes, regroupant les données en un paquet bien rangé. Les données et les méthodes dans la classe sont appelées membres de la classe.

Définition de la classe Ruby

Lorsque vous définissez une classe, vous définissez en réalité un plan de type de données. Cela ne définit pas de données, mais définit ce que signifie le nom de la classe, c'est-à-dire ce que composent les objets de la classe et quelles opérations peuvent être exécutées sur ces objets.

La définition de la classe se termine par le mot-clé class La définition de la classe commence parnom de la classe,et enfin, commence par un end pour séparer et terminer la définition de la classe. Par exemple, nous utilisons le mot-clé class pour définir la classe Box, comme suit :

class Box
   code
end

Selon la convention, le nom doit commencer par une majuscule, et si il contient plusieurs mots, chaque mot doit commencer par une majuscule, mais sans séparateurs (par exemple : CamelCase).

définir un objet Ruby

La classe fournit un plan pour les objets, donc en général, les objets sont créés selon la classe. Nous utilisons new La syntaxe des mots-clés déclare un objet de la classe. Les lignes suivantes déclarent deux objets de la classe Box :

box1 = Box.new
box2 = Box.new

méthode initialize

initialize La méthode est une méthode de classe standard en Ruby, c'est le constructeur de la classe, et il est similaire à celui des autres langages de programmation orientés objet constructeur Le principe de fonctionnement est similaire. Lorsque vous souhaitez initialiser des variables de classe en même temps que la création d'un objet, la méthode initialize entre en jeu. Cette méthode prend une série de paramètres, comme d'autres méthodes Ruby, et doit être précédée de def La syntaxe des mots-clés, comme suit :

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

Exemple de variable

Exemple de variableLes attributs de classe, qui deviennent les attributs de l'objet lors de la création d'un objet à partir de la classe. Chaque attribut de l'objet est assigné individuellement, et les valeurs ne sont pas partagées entre les autres objets. À l'intérieur de la classe, les attributs sont accédés à l'aide de l'opérateur @, et à l'extérieur de la classe, c'est en utilisant ce qui est appeléaccessor methodsofPublicmethod to access. Below we use the class Box For example, use @width and @height as instance variables of the class Box.

class Box
   def initialize(w,h)
      # Assigning a value to the example variable
      @width, @height = w, h
   end
end

Accesser (getter) & Setter (setter) methods

To read variables defined within the class from outside the class, we can define accessor (getter) methods to access. The following example demonstrates the usage of accessor methods:

Exemple en ligne

#!/usr/bin/ruby -w
 
# Define class
class Box
   # Constructor
   def initialize(w,h)
      @width, @height = w, h
   end
 
   # Méthodes d'accès
   def printWidth
      @width
   end
 
   def printHeight
      @height
   end
end
 
# Creating an object, initializing the height and width of the box
box = Box.new(10, 20)
 
# Méthodes d'accès
x = box.printWidth()
y = box.printHeight()
 
puts "Box width: #{x}"
puts "Box height: #{y}"

当上面的代码执行时,它会产生以下结果:

Box width : 10
Box height : 20

Similar to the accessor method used to access variable values, Ruby provides a way to pass parameters to class-defined variables from outside the class, which is known asSetter method, defined as follows:

Exemple en ligne

#!/usr/bin/ruby -w
 
# Define class
class Box
   # Constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
 
   # Méthodes d'accès
   def getWidth
      @width
   end
   def getHeight
      @height
   end
 
   # Méthodes de setter
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end
 
# Create object
box = Box.new(10, 20)
 
# Using setter method
box.setWidth = 30
box.setHeight = 50
 
# Méthodes d'accès
x = box.getWidth()
y = box.getHeight()
 
puts "Box width: #{x}"
puts "Box height: #{y}"

当上面的代码执行时,它会产生以下结果:

Box width : 30
Box height : 50

Since both methods are very commonly used, Ruby defines attr_accessor :variable_name, attr_reader :variable_name, attr_writer :variable_name Three methods of property declaration. Among which:accessor = reader+writer.

At the same time, note that the variable name must be prefixed with :, and variable names must be separated by ,

instance methods

instance methodsThe definition is the same as other method definitions, using def Keywords, but they can only be used through class instances, as shown in the following example. Their functions are not limited to accessing instance variables, but can also perform other tasks as needed.

Exemple en ligne

#!/usr/bin/ruby -w
 
# Define class
class Box
   # Constructor
   def initialize(w,h)
      @width, @height = w, h
   end
   # Example method
   def getArea
      @width * @height
   end
end
 
# Create object
box = Box.new(10, 20)
 
# Call example method
a = box.getArea()
puts "Area of the box is: #{a}"

当上面的代码执行时,它会产生以下结果:

Area of the box is : 200

Class methods & class variables

Class variableare shared variables across all instances of the class. In other words, the class variable instance can be accessed by all object instances. Class variables are prefixed with two @ characters (@@), and class variables must be initialized within the class definition, as shown in the following example.

class methodsUsing def self.methodname() Definition, class methods end with the delimiter end. Class methods can use names with the class name as prefix classname.methodname Formal call, as shown in the following example:

Exemple en ligne

#!/usr/bin/ruby -w
 
class Box
   # Initializing class variable
   @@count = 0
   def initialize(w,h)
      # Assigning a value to the example variable
      @width, @height = w, h
 
      @@count += 1
   end
 
   def self.printCount()
      puts "Box count is: #@@count"
   end
end
 
# Créer deux objets
box1 = Box.new(10, 20)
box2 = Box.new(30, 100)
 
# Appel de la méthode de classe pour afficher le comptage des boîtes
Box.printCount()

当上面的代码执行时,它会产生以下结果:

Le comptage de Box est : 2

méthode to_s

Toute classe que vous définissez a une to_s Les méthodes d'exemple permettent de retourner la représentation en chaîne de caractères de l'objet. Voici un exemple simple, selon la largeur et la hauteur pour représenter l'objet Box :

Exemple en ligne

#!/usr/bin/ruby -w
 
class Box
   # Constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # Définir la méthode to_s
   def to_s
      "(w:#@width,h:#@height)"  # Format de chaîne de l'objet
   end
end
 
# Create object
box = Box.new(10, 20)
 
# Appel automatique de la méthode to_s
puts "Représentation en chaîne de caractères de la boîte : : #{box}"

当上面的代码执行时,它会产生以下结果:

Représentation en chaîne de caractères de la boîte : (w:10,h:20)

contrôle d'accès

Ruby vous offre trois niveaux de protection des méthodes d'exemple,分别是 public, privé ou protégé.Ruby n'applique aucune contrôle d'accès aux exemples et aux variables de classe.

  • Méthode publique : Les méthodes publiques peuvent être appelées par n'importe quel objet. Par défaut, les méthodes sont publiques, à l'exception de la méthode initialize qui est toujours privée.

  • Méthode privée : Les méthodes privées ne peuvent pas être appelées ou consultées à partir de l'extérieur de la classe. Seules les méthodes de la classe peuvent accéder aux membres privés.

  • Méthode protégée : Les méthodes protégées peuvent être appelées par les objets de la classe et ses sous-classes. L'accès peut également être effectué à l'intérieur de la classe et de ses sous-classes.

Voici un exemple simple qui montre la syntaxe des trois modificateurs :

Exemple en ligne

#!/usr/bin/ruby -w
 
# Define class
class Box
   # Constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
 
   # Les méthodes d'exemple sont par défaut publiques
   def getArea
      getWidth() * getHeight
   end
 
   # Définir des méthodes d'accès privées
   def getWidth
      @width
   end
   def getHeight
      @height
   end
   # Les rendre privées
   privé :getWidth, :getHeight
 
   # Méthode d'exemple pour afficher la surface
   def printArea
      @aire = getWidth() * getHeight
      puts "La surface de la grande boîte est : \@area"
   end
   # Rendre la méthode d'exemple protégée
   protégée :printArea
end
 
# Create object
box = Box.new(10, 20)
 
# Call example method
a = box.getArea()
puts "Area of the box is: #{a}"
 
# Tentative d'appel d'une méthode protégée
box.printArea()

Lorsque ce code est exécuté, il produit les résultats suivants. Ici, la première méthode est appelée avec succès, mais la deuxième méthode pose un problème.

Area of the box is : 200
test.rb:42: méthode protégée `printArea' appelée pour #
<Boîte:0xb7f11280 @hauteur=20, @largeur=10> Erreur de méthode non trouvée

l'héritage des classes

héritage, qui est l'une des principales concepts de programmation orientée objet. L'héritage nous permet de définir une classe en fonction d'une autre classe, ce qui rend la création et la maintenance des applications plus faciles.

L'héritage aide à réutiliser le code et à exécuter rapidement, malheureusement, Ruby ne supporte pas l'héritage multiple, mais Ruby supporte mixins.Mixin est une implémentation spécifique de l'héritage multiple, où seules les parties interface sont héritées.

Lors de la création d'une classe, le programmeur peut directement spécifier que la nouvelle classe hérite des membres d'une classe existante, sans avoir à réécrire de nouveaux membres de données et fonctions membres. Cette classe existante est appeléeclasse de base ou classe parente, la nouvelle classe est appeléeclasse dérivée ou sous-classe.

Ruby offre également le concept de spécialisation, qui est l'héritage. Les exemples suivants expliquent ce concept. L'extension d'une classe est très simple. Il suffit d'ajouter un < suivi du nom de la classe parente à la déclaration de la classe. Par exemple, la classe suivante est définie : BigBox est Box de la sous-classe :

Exemple en ligne

#!/usr/bin/ruby -w
 
# Define class
class Box
   # Constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # Example method
   def getArea
      @width * @height
   end
end
 
# Définir une sous-classe
class BigBox < Box
 
   # Ajouter une nouvelle méthode d'exemple
   def printArea
      @area = @width * @height
      puts "La surface de la grande boîte est : \@area"
   end
end
 
# Create object
box = BigBox.new(10, 20)
 
# Afficher l'aire
box.printArea()

当上面的代码执行时,它会产生以下结果:

La surface de la grande boîte est : 200

redéfinition de méthode

Bien que vous puissiez ajouter de nouvelles fonctionnalités dans la classe dérivée, parfois vous pouvez vouloir changer le comportement d'une méthode déjà définie dans la classe parente. Dans ce cas, vous pouvez conserver le nom de la méthode, mais redéfinir sa fonctionnalité, comme dans l'exemple suivant :

Exemple en ligne

#!/usr/bin/ruby -w
 
# Define class
class Box
   # Constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # Example method
   def getArea
      @width * @height
   end
end
 
# Définir une sous-classe
class BigBox < Box
 
   # Changer la méthode existante getArea
   def getArea
      @area = @width * @height
      puts "La surface de la grande boîte est : \@area"
   end
end
 
# Create object
box = BigBox.new(10, 20)
 
# Afficher l'aire en utilisant la méthode surchargée
box.getArea()

Les résultats d'exécution des exemples ci-dessus sont :

La surface de la grande boîte est : 200

opérateur d'encapsulation

nous voulons utiliser + opérateur pour effectuer l'addition vectorielle entre deux objets Box, en utilisant * opérateur pour multiplier la largeur et la hauteur de Box, en utilisant un opérateur unaire - Calculer l'inverse de width et height de Box. Voici une version de la classe Box avec des opérateurs mathématiques définis :

class Box
  def initialize(w,h) # Initialiser width et height
    @width, @height = w, h
  end
 
  def +(other) # Définir + pour exécuter l'addition vectorielle
    Box.new(@width + other.width, @height + other.height)
  end
 
  def -@ # Définir un opérateur unaire - inverser les valeurs de width et height
    Box.new(-@width, -@height)
  end
 
  def *(scalar)        # Effectuer la multiplication scalaire
    Box.new(@width*scalar, @height*scalar)
  end
end

figer l'objet

Parfois, nous voulons empêcher un objet d'être modifié. Dans Object, la méthode freeze permet cela, elle transforme efficacement un objet en une constante. Tout objet peut être figé en appelant Object.freeze pour figer. Un objet figé ne peut pas être modifié, c'est-à-dire que vous ne pouvez pas changer ses variables d'exemple.

Vous pouvez utiliser Object.frozen? La méthode vérifie si un objet donné a été figé. Si l'objet a été figé, cette méthode retourne true, sinon elle retourne une valeur false. L'exemple suivant explique ce concept :

Exemple en ligne

#!/usr/bin/ruby -w
 
# Define class
class Box
   # Constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
 
   # Méthodes d'accès
   def getWidth
      @width
   end
   def getHeight
      @height
   end
 
   # Méthodes de setter
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end
 
# Create object
box = Box.new(10, 20)
 
# Laissons figer cet objet
box.freeze
if( box.frozen? )
   puts "L'objet Box est un objet figé"
else
   puts "L'objet Box est un objet normal"
end
 
# Essayons maintenant d'utiliser les méthodes de setter
box.setWidth = 30
box.setHeight = 50
 
# Méthodes d'accès
x = box.getWidth()
y = box.getHeight()
 
puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

当上面的代码执行时,它会产生以下结果:

L'objet Box est un objet figé
test.rb:20:in `setWidth=': can't modify frozen object (TypeError)
        from test.rb:39

Constante de classe

Vous pouvez définir un constant à l'intérieur de la classe, en assignant une valeur numérique ou une valeur de chaîne directe à une variable. La définition d'un constant n'a pas besoin d'utiliser @ ou @@. D'habitude, le nom des constants est en majuscules.

Une fois qu'un constant est défini, vous ne pouvez pas changer sa valeur, vous pouvez accéder directement au constant à l'intérieur de la classe, comme si c'était une variable, mais si vous souhaitez accéder au constant à l'extérieur de la classe, vous devez utiliser classname::constant,如下面示例所示。

Exemple en ligne

#!/usr/bin/ruby -w
 
# Define class
class Box
   BOX_COMPANY = "TATA Inc"
   BOXWEIGHT = 10
   # Constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # Example method
   def getArea
      @width * @height
   end
end
 
# Create object
box = Box.new(10, 20)
 
# Call example method
a = box.getArea()
puts "Area of the box is: #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"

当上面的代码执行时,它会产生以下结果:

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

Class constants can be inherited and can also be overloaded like example methods.

Use allocate to create an object

There may be a situation where you want to create an object without calling the object constructor initialize In the case of creating an object, that is, using the new method to create an object, in this case, you can call allocate to create an uninitialized object, as shown in the following example:

Exemple en ligne

#!/usr/bin/ruby -w
 
# Define class
class Box
   attr_accessor :width, :height
 
   # Constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
 
   # Example method
   def getArea
      @width * @height
   end
end
 
# Use new to create an object
box1 = Box.new(10, 20)
 
# Use allocate to create another object
box2 = Box.allocate
 
# Use box1 Call example method
a = box1.getArea()
puts "Area of the box is: #{a}"
 
# Use box2 Call example method
a = box2.getArea()
puts "Area of the box is: #{a}"

当上面的代码执行时,它会产生以下结果:

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

Class information

Ruby's self and Java's this have similarities, but they are also very different. Java methods always refer to the current object, so this is usually the current object. However, Ruby code is executed line by line, so self has different meanings in different contexts. Let's take a look at the following example:.

Exemple en ligne

#!/usr/bin/ruby -w
 
class Box
   # 输出类信息
   puts "Classe de self = #{self.class}"
   puts "Nom de self = #{self.name}"
end

当上面的代码执行时,它会产生以下结果:

Classe de self = Class
Nom de self = Box

这意味着类定义可以通过将此类作为当前对象来执行,同时也意味着元类和父类中的该方法在方法定义执行期间是可用的。