Ich weiß nicht viel über die richtige Verwendung von Vererbung und Delegation, deshalb habe ich es zusammengefasst.
Es soll die Funktion von einer anderen Klasse übernehmen und eine neue Klasse erstellen.
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
Es geht darum, einen bestimmten Prozess (Verantwortung) an eine Methode einer anderen Klasse zu delegieren.
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
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
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
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