메서드 오버라이딩
Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 23번째.
서브클래스는 같은 이름으로 메서드를 정의하여 메서드를 재정의할 수 있습니다. Ruby는 먼저 객체 자체의 클래스에서 메서드를 찾고, 그다음에야 슈퍼클래스에서 찾으므로 서브클래스의 버전이 우선합니다:
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Fish < Animal
end
puts Dog.new.speak
puts Fish.new.speak출력:
Woof
...다른 메서드를 호출하는 슈퍼클래스 메서드는 서브클래스 객체에 대해 재정의된 버전을 사용합니다. 공유 메서드는 한 번만 작성하고, 각 서브클래스는 다른 부분만 변경합니다:
class Animal
def initialize(name)
@name = name
end
def introduce
"#{@name} says #{speak}"
end
def speak
"..."
end
end
class Cat < Animal
def speak
"Meow"
end
end
puts Cat.new("Tom").introduce
puts Animal.new("Thing").introduce출력:
Tom says Meow
Thing says ...하위 클래스에서 to_s를 재정의하면 해당 하위 클래스의 출력 방식만 변경됩니다. 재정의하지 않은 메서드는 여전히 상위 클래스에서 가져옵니다:
class Item
def initialize(name, price)
@name = name
@price = price
end
def to_s
format("%s %.2f", @name, @price)
end
end
class SaleItem < Item
def to_s
format("%s %.2f (sale)", @name, @price * 0.8)
end
end
puts Item.new("Lamp", 20)
puts SaleItem.new("Lamp", 20)출력:
Lamp 20.00
Lamp 16.00 (sale)Ruby가 검색하는 순서는 클래스의 조상입니다. 즉, 클래스 자체에서 시작하여 슈퍼클래스로 이동하고, Object까지 계속됩니다. 해당 목록에서 메서드를 정의한 첫 번째 클래스가 그 메서드를 제공합니다.
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Puppy < Dog
end
puts Puppy.new.speak
p Puppy.ancestors.take(3)출력:
Woof
[Puppy, Dog, Animal]챌린지
쉬움급여 클래스를 완성하세요. Employee는 name을 저장하며, hours * 20을 반환하는 pay(hours)와 pay를 사용하여 Ada: 800을 반환하는 payslip(hours)을 가집니다. Manager는 시간과 관계없이 고정된 1500을 반환하도록 pay를 재정의합니다. Intern은 pay를 hours * 12로 재정의하지만, 최대 300까지만 반환합니다. payslip은 Employee에만 정의됩니다.
제공된 코드는 employee Ada 40, manager Bo 50 또는 intern Cy 20 형식의 줄을 읽고, 일치하는 객체를 생성하여 해당 객체의 급여 명세서를 출력한 다음 총 급여를 출력합니다.
코드는 employee.rb, manager.rb 및 intern.rb에 작성하세요. main.rb에는 제공된 입력/출력 코드가 포함되어 있으며 편집할 수 없습니다.
직접 해보기
require_relative 'employee'
require_relative 'manager'
require_relative 'intern'
# 제공된 입력/출력 코드: 그대로 유지하세요
input = []
while (line = gets)
input << line.chomp
end
kinds = { "employee" => Employee, "manager" => Manager, "intern" => Intern }
total = 0
input.each do |line|
kind, name, hours = line.split
worker = kinds[kind].new(name)
puts worker.payslip(hours.to_i)
total += worker.pay(hours.to_i)
end
puts "total: #{total}"
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Ruby 컴파일러