Trong ngôn ngữ lập trình Ruby, khi làm việc với lập trình hướng đối tượng, việc thừa kế và sử dụng lại mã nguồn là một phần rất quan trọng. Một khái niệm thường gặp trong Ruby là việc gọi phương thức của lớp cha từ lớp con. Đây là nơi mà từ khóa super
trở nên hữu ích.
Khái quát về thừa kế trong Ruby
Trước hết, hãy bắt đầu với một cái nhìn tổng quan về thừa kế trong Ruby. Thừa kế là cơ chế cho phép một lớp con (subclass) kế thừa các thuộc tính và phương thức của một lớp cha (superclass), giúp tái sử dụng mã nguồn và giảm thiểu việc viết lại mã.
class Animal
def make_sound
puts "Some generic sound"
end
end
class Dog < Animal
def make_sound
puts "Bark!"
end
end
dog = Dog.new
dog.make_sound # Output: Bark!
Trong ví dụ trên, lớp Dog
thừa kế lớp Animal
, và chúng ta đã ghi đè phương thức make_sound
của lớp cha bằng phương thức của lớp con.
Sử dụng từ khóa super
Từ khóa super
trong Ruby cho phép lớp con gọi một phương thức của lớp cha có cùng tên. Điều này có thể đặc biệt hữu ích khi bạn muốn mở rộng hoặc tùy chỉnh hành vi của phương thức lớp cha trong lớp con mà không muốn mất đi chức năng của nó.
Ví dụ cơ bản
class Animal
def make_sound
puts "Some generic sound"
end
end
class Dog < Animal
def make_sound
super
puts "Bark!"
end
end
dog = Dog.new
dog.make_sound
Khi chúng ta gọi phương thức make_sound
trên đối tượng dog
, đầu ra sẽ là:
Some generic sound
Bark!
Trong ví dụ này, từ khóa super
được sử dụng để gọi phương thức make_sound
của lớp cha Animal
trước khi thêm dòng "Bark!".
Truyền tham số với super
Nếu phương thức của lớp cha yêu cầu tham số, bạn cũng có thể truyền các tham số đó khi sử dụng super
. Ruby cung cấp hai cách để truyền tham số: truyền tất cả các tham số hoặc truyền cụ thể từng tham số.
Truyền tất cả tham số
Giả sử phương thức của lớp cha nhận tham số, bạn có thể sử dụng super
để truyền tất cả chúng.
class Animal
def make_sound(sound)
puts "Animal makes a #{sound} sound"
end
end
class Dog < Animal
def make_sound(sound)
super
puts "Dog barks with #{sound} sound"
end
end
dog = Dog.new
dog.make_sound("loud")
Kết quả sẽ là:
Animal makes a loud sound
Dog barks with loud sound
Truyền cụ thể từng tham số
Trong trường hợp bạn muốn tùy chỉnh giá trị của tham số trước khi truyền, bạn có thể làm như sau:
class Animal
def make_sound(volume, pitch)
puts "Animal makes a sound at #{volume} volume and #{pitch} pitch"
end
end
class Dog < Animal
def make_sound(volume, pitch)
super(volume, pitch)
puts "Dog barks with #{volume} volume and #{pitch} pitch"
end
end
dog = Dog.new
dog.make_sound("medium", "high")
Kết quả sẽ là:
Animal makes a sound at medium volume and high pitch
Dog barks with medium volume and high pitch
Phương thức khởi tạo và super
Từ khóa super
cũng thường được sử dụng trong các phương thức khởi tạo (constructor) khi lớp con cần gọi phương thức khởi tạo của lớp cha.
class Animal
def initialize(name)
@name = name
end
end
class Dog < Animal
def initialize(name, breed)
super(name)
@breed = breed
end
end
dog = Dog.new("Rex", "Labrador")
Trong ví dụ này, lớp Dog
gọi phương thức khởi tạo của lớp cha Animal
để đảm bảo rằng tên của con vật được khởi tạo đúng cách.
Kết Luận
Sử dụng từ khóa super
trong Ruby là một cách hữu hiệu để mở rộng và tùy chỉnh hành vi của các phương thức được thừa kế từ lớp cha. Điều này không chỉ giúp giảm thiểu viết lại mã mà còn giúp quản lý mã nguồn một cách dễ dàng và hiệu quả hơn. Bằng cách hiểu rõ cách làm việc của super
, bạn có thể tận dụng tối đa lợi thế của lập trình hướng đối tượng trong Ruby.
Comments