Lớp con
Thuộc phần Lập trình hướng đối tượng trong hành trình Ruby của Coddy. Bài học 22 trên 57.
Kế thừa (inheritance) tạo một lớp mới dựa trên lớp hiện có. class Dog < Animal biến Dog thành lớp con của Animal, lớp cha của nó. Một chú chó có mọi phương thức của động vật, bao gồm cả initialize, cùng với các phương thức mà Dog bổ sung:
class Animal
attr_reader :name
def initialize(name)
@name = name
end
def eat
"#{name} is eating"
end
end
class Dog < Animal
def fetch
"#{name} fetches the ball"
end
end
rex = Dog.new("Rex")
puts rex.eat
puts rex.fetchĐầu ra:
Rex is eating
Rex fetches the ballCác phương thức được thêm vào chỉ thuộc về lớp con. Một Animal thông thường không có chúng, và một lớp cùng cấp như Cat không thể thấy các phương thức của Dog:
class Animal
def breathe
"breathing"
end
end
class Dog < Animal
def fetch
"fetching"
end
end
class Cat < Animal
end
puts Cat.new.breathe
begin
Cat.new.fetch
rescue NoMethodError => e
puts e.message
endĐầu ra:
breathing
undefined method `fetch' for an instance of Catsuperclass cho biết lớp cha của một lớp. Một lớp Ruby chỉ có đúng một lớp cha, và lớp được khai báo không có < sẽ kế thừa từ Object, lớp này cung cấp cho mọi đối tượng các phương thức như to_s và inspect:
class Animal
end
class Dog < Animal
end
puts Dog.superclass
puts Animal.superclass
puts Object.superclassĐầu ra:
Animal
Object
BasicObjectKế thừa phù hợp với mối quan hệ is-a: chó là động vật, tài khoản tiết kiệm là tài khoản. Hành vi dùng chung được đặt một lần trong lớp cha, còn mỗi lớp con bổ sung những điểm khác biệt. Trong phần này, mỗi lớp nằm trong một tệp riêng và tệp của lớp cha được tải trước:
# main.rb
require_relative 'animal' # lớp cha trước
require_relative 'dog' # class Dog < Animal cần Animal
require_relative 'cat'Thử thách
DễHoàn thiện các lớp. Vehicle lưu trữ name và số lượng wheels, đồng thời có describe, trả về Mini has 4 wheels. Car và Bike là các lớp con của Vehicle, không định nghĩa initialize. Car bổ sung honk, trả về Mini says beep, còn Bike bổ sung ring, trả về BMX rings.
Code được cung cấp đọc các dòng car Mini hoặc bike BMX, tạo một Car có 4 bánh hoặc một Bike có 2 bánh, rồi in ra kết quả của describe, âm thanh (honk hoặc ring) và lớp cha của lớp đối tượng.
Đặt code của bạn trong vehicle.rb, car.rb và bike.rb. main.rb chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.
Tự làm thử
require_relative 'vehicle'
require_relative 'car'
require_relative 'bike'
# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên
input = []
while (line = gets)
input << line.chomp
end
input.each do |line|
kind, name = line.split(" ", 2)
if kind == "car"
v = Car.new(name, 4)
sound = v.honk
else
v = Bike.new(name, 2)
sound = v.ring
end
puts v.describe
puts sound
puts v.class.superclass
end
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpBiến instancePhương thức và selfto_s và inspectÔn tập: thẻ thư viện4Tính đóng gói
Phương thức riêng tưPhương thức được bảo vệPhương thức thiết lập riêng tưBảo vệ trạng tháiÔn tập: máy bán hàng tự động7Tính đa hình và duck typing
Tính đa hìnhDuck typingPhương thức trừu tượngcase và lớpÔn tập: phương thức thanh toán2Phương thức truy cập và self
Phương thức đọc và ghiPhương thức gán tùy chỉnhself trong phương thứcĐịnh danh và tính bằng nhauÔn tập: Danh sách liên hệTự luyện tập: Trình biên dịch Ruby online