Menu
CoddyTech

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 ball

Cá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 Cat

superclass 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
BasicObject

Kế 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'
challenge icon

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
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Ruby online