×

Gọi phương thức của lớp cha với super trong Ruby

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