Ruby-Vererbung und -Delegierung

Ich weiß nicht viel über die richtige Verwendung von Vererbung und Delegation, deshalb habe ich es zusammengefasst.

Erbe

Es soll die Funktion von einer anderen Klasse übernehmen und eine neue Klasse erstellen.

Beispiel

Erstellen Sie eine Foo-Klasse, indem Sie alle Methoden von der Basisklasse erben

class Base
  def message
    'ok'
  end
end

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

Transfer

Es geht darum, einen bestimmten Prozess (Verantwortung) an eine Methode einer anderen Klasse zu delegieren.

Beispiel

Delegieren Sie die Nachrichtenmethode der Basisklasse an die Foo-Klasse

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

Szenen, die Vererbung verwenden

Gleiche Rolle

Egal, ob Sie ein junger Ingenieur oder ein erfahrener Tsuyotsuyo-Ingenieur sind, die Rolle eines Programmierers ist dieselbe. Lassen Sie uns also die Progurammer-Klasse erben und die Funktion so erben, wie sie ist.

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

  def type_is
    puts "ich#{type}ist."
  end

  def langage_is
    str = ''
    langages.each do |lang|
      str += "#{lang} "
    end
    puts "ich#{str}Kann mit der Sprache von umgehen"
  end

  def klass_is
    str = case self.class.name
    when 'TsuyoTsuyo'
      'Starker Ingenieur'
    when 'Kakedashi'
      'Jungingenieur'
    end

    puts "ich#{str}ist."
  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

Szenen mit Delegation

Ich möchte einige Funktionen verwenden, obwohl die Rollen unterschiedlich sind

Programmierer und Designer haben unterschiedliche Rollen. Verwenden Sie in diesem Fall die Delegierung, damit nur die Methode "type_is" von der Programmer-Klasse geerbt wird.

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

  def type_is
    puts "ich#{type}ist."
  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 #Dieser Typ_ist Methode`Programmer`Von der Klasse geerbte Methode

Zusammenfassung

Vielen Dank, dass Sie so weit gelesen haben. Ich hoffe, es wird eine Gelegenheit sein, meinen Code zu überprüfen.

Normalerweise entwickle ich Webdienste mit Rails, aber ich glaube nicht, dass es viele Gelegenheiten gibt, die Delegierung zu verwenden. Es ist auch wahr, dass ich früher "Vererbung !!" sagte. Es ist schwer zu beurteilen, ob die Vererbungsbeziehung gut ist oder ob es besser ist, die Delegierung zu verwenden, aber in Zukunft habe ich beschlossen, sie einschließlich der Option der Verwendung der Delegierung zu implementieren.

Recommended Posts

Ruby-Vererbung und -Delegierung
Über objektorientierte Vererbung und über Ertrag Ruby
Informationen zur Ruby-Vererbung
Rubin und Edelstein
Vererbung und Schnittstelle.
[Ruby] Klassen und Instanzen
Symbole und zerstörerischer Rubin
[Ruby] Big Decimal und DECIMAL
Ruby-Klassen und -Instanzen
Über Kapselung und Vererbung
[Ruby] Klassenverschachtelung, Vererbung und die Grundlagen des Selbst
Ruby-Syntaxfehler und Gegenmaßnahmen
Über Ruby-Hashes und -Symbole
Ruby C Erweiterung und flüchtig
Fassen Sie Ruby und Dependency Injection zusammen
Über Ruby und Objektmodell
[Ruby] Singuläre Methoden und singuläre Klassen
Informationen zu Ruby-Klassen und -Instanzen
Ruby-Methoden und -Klassen (grundlegend)
Erstellen von Ruby-Klassen und -Instanzen
[Ruby] Unterschied zwischen get und post
Erbe
[Ruby] Unterschied zwischen is_a? Und instance_of?
Ruby-Standardeingabe und verschiedene Methoden
Über Ruby einfache Anführungszeichen und doppelte Anführungszeichen
[PHP] Vererbungs-, Schutz- und Referenzmuster
[Ruby-Grundlagen] Split-Methode und to_s-Methode
Informationen zum Ruby-Produktoperator (&) und zum Summenoperator (|)
Schreiben Sie Schlüssel und Werte in Ruby
Upgrade der Ruby- und Rails-Version des Projekts
Mit Rubin ● × Game und Othello (Grundlegende Bewertung)
Aktualisieren und wechseln Sie Ruby-Versionen unter Windows 10
Hinweis: Unterschied zwischen Ruby "p" und "Puts"
Blasensortierung durchführen und mit Ruby sortieren auswählen
[Rubiy] Vereinfache jedes mit Map und Inject
Erläuterung der Ruby Time- und Date-Objekte
Lassen Sie uns mit Vererbung faulenzen und überschreiben
[Ruby] Schleifenunterscheidung und Verwendung in Ruby
Unterschied zwischen "|| =" und "instance_variable_defined?" Im Ruby-Memo
[Einfach] So aktualisieren Sie Ruby und Bundler
Vergleich von JavaScript-Objekten und Ruby-Klassen
Schreiben Sie Code mit Ruby-Klassen und -Instanzen
[Ruby] Unterschied zwischen print, put und p
Unterschied zwischen Ruby-Zeichenketten und Symbolen [Anfänger]
Konvertieren Sie mit Ruby von JSON nach TSV und von TSV nach JSON