Héritage et délégation Ruby

Je ne sais pas grand-chose sur l'utilisation appropriée de l'héritage et de la délégation, alors je l'ai résumé.

Héritage

Il s'agit de reprendre la fonction d'une autre classe et de créer une nouvelle classe.

Exemple

Créer une classe Foo en héritant de toutes les méthodes de la classe Base

class Base
  def message
    'ok'
  end
end

class Foo < Base; end
  
foo = Foo.new
puts foo.message
# => ok

transfert

Il s'agit de déléguer un processus spécifique (responsabilité) à une méthode d'une autre classe.

Exemple

Déléguez la méthode de message de la classe Base à la classe Foo

class Base
  def message
    'ok'
  end
end

require 'forwardable'
class Foo
  extend Forwardable
  attr_reader :mess

  def initialize
    @mess = Base.new
  end
  def_delegator :mess, :message
end
  
foo = Foo.new
puts foo.message
# => ok

Scènes qui utilisent l'héritage

Même rôle

Que vous soyez un ingénieur débutant ou un ingénieur Tsuyotsuyo expérimenté, le rôle d'un programmeur est le même. Alors, héritons de la classe Progurammer et héritons de la fonction telle qu'elle est.

class Programmer
  def initialize(type, langages)
    @type = type
    @langages = Array(langages)
  end

  def type_is
    puts "je#{type}est."
  end

  def langage_is
    str = ''
    langages.each do |lang|
      str += "#{lang} "
    end
    puts "je#{str}Peut gérer la langue de"
  end

  def klass_is
    str = case self.class.name
    when 'TsuyoTsuyo'
      'Ingénieur fort'
    when 'Kakedashi'
      'Ingénieur débutant'
    end

    puts "je#{str}est."
  end

  private
  attr_accessor :type, :langages
end

class TsuyoTsuyo < Programmer; end

class Kakedashi < Programmer; end

tsuyo = TsuyoTsuyo.new('Backend', %w[C C++ Python Go Ruby])
tsuyo.type_is
tsuyo.langage_is
tsuyo.klass_is

kake = Kakedashi.new('Frontend', %w[HTML CSS jQuery])
kake.type_is
kake.langage_is
kake.klass_is

Scènes utilisant la délégation

Je souhaite utiliser certaines fonctions bien que les rôles soient différents

Les programmeurs et les concepteurs ont des rôles différents. Donc, dans ce cas, utilisez la délégation pour que seule la méthode type_is soit héritée de la classe Programmer.

require 'forwardable'
class Programmer
  def initialize(type, langages)
    @type = type
    @langages = Array(langages)
  end

  def type_is
    puts "je#{type}est."
  end

  private
  attr_accessor :type, :langages
end

class Designer
  extend Forwardable

  def initialize(type, skills)
    @programmer = Programmer.new(type, nil)
    @type = type
    @skills = Array(skills)
  end

  def_delegator :@programmer, :type_is

  private
  attr_accessor :type, :skills
end

class IkeIke < Designer; end

ikeike = IkeIke.new('WebDesigner', %w[HTML CSS Adobe JavaScript])
ikeike.type_is #Ce type_est la méthode`Programmer`Méthode héritée de la classe

Sommaire

Merci d'avoir lu jusqu'ici. J'espère que ce sera l'occasion de revoir mon code.

Je développe généralement des services Web avec Rails, mais je ne pense pas qu'il existe de nombreuses occasions d'utiliser la délégation. Il est vrai aussi que je disais "héritage !!" Il est difficile de juger si la relation d'héritage est bonne ou s'il vaut mieux utiliser la délégation, mais à l'avenir, j'ai décidé de la mettre en œuvre en incluant l'option d'utiliser la délégation.

Recommended Posts

Héritage et délégation Ruby
À propos de l'héritage orienté objet et du rendement Ruby
À propos de l'héritage Ruby
Rubis et gemme
Héritage et interface.
[Ruby] Classes et instances
Symboles et rubis destructeur
[Ruby] Big Decimal et DECIMAL
Classes et instances Ruby
À propos de l'encapsulation et de l'héritage
[Ruby] Imbrication de classes, héritage et principes de base de soi
Erreurs de syntaxe et contre-mesures Ruby
À propos des hachages et symboles Ruby
Extension Ruby C et volatile
Résumer l'injection de rubis et de dépendances
À propos de Ruby, modèle objet
[Ruby] Méthodes singulières et classes singulières
À propos des classes et des instances Ruby
Méthodes et classes Ruby (basiques)
Création de classes et d'instances Ruby
[Ruby] Différence entre obtenir et publier
Héritage
[Ruby] Différence entre is_a? Et instance_of?
Entrée standard Ruby et diverses méthodes
À propos des guillemets simples et doubles Ruby
[PHP] Patrons d'héritage, protégés et de référence
[Bases de Ruby] méthode split et méthode to_s
À propos de l'opérateur de produit Ruby (&) et de l'opérateur somme (|)
Ecrire des clés et des valeurs dans Ruby
Mise à niveau de la version du projet Ruby and Rails
Avec ruby ● × Game et Othello (examen de base)
Mettre à niveau et changer de version de Ruby sous Windows 10
Remarque: Différence entre Ruby "p" et "met"
Faire un tri à bulles et sélectionner le tri avec Ruby
[Rubiy] Simplifiez chaque utilisation de la carte et injectez
Explication des objets Ruby Time et Date
Soyons paresseux avec l'héritage et le remplacement
[Ruby] Distinction et utilisation des boucles dans Ruby
Différence entre "|| =" et "instance_variable_defined?" Dans Ruby memo
[Facile] Comment mettre à niveau Ruby et le bundler
Comparaison des objets JavaScript et des classes Ruby
Écrire du code à l'aide de classes et d'instances Ruby
[Ruby] Différence entre print, put et p
Différence entre les chaînes de caractères et les symboles Ruby [Débutant]
Conversion de JSON en TSV et TSV en JSON avec Ruby