5.2.10  Stack theo phương pháp hướng đối tượng (4)

Bây giờ chúng ta sẽ làm một cái gì đó cao thủ hơn nhé. Giả sử chúng ta cần một class mới để xử lý ngăn xếp, class mới này có thể tính được tổng của tất cả các phần tử hiện được lưu trữ trên ngăn xếp. Chúng ta không muốn thay đổi class đã định nghĩa trước đó. Chúng ta cần một ngăn xếp mới với khả năng mới. Nói cách khác, chúng ta muốn xây dựng một phân lớp (class con) của class Stack.

Đầu tiên chúng ta sẽ khai báo một class con kế thừa từ class cha – chính là class Stack. Nó sẽ như thế này →

Class này không định nghĩa bất kỳ thành phần mới nào, nhưng điều đó không có nghĩa là nó trống. Nó kế thừa tất cả các thành phần được định nghĩa bởi class cha của nó – tên của class cha được viết sau dấu hai chấm ngay sau tên class mới.

Bất kỳ đối tượng nào của class AddingStack đều có thể làm tất cả mọi thứ mà mỗi đối tượng của class Stack có thể làm.

Bây giờ chúng ta đưa vào class mới một số thay đổi.

  1. Hàm push không chỉ để đẩy giá trị lên ngăn xếp, mà cộng thêm giá trị đó vào biến sum
  2. Hàm pop không chỉ để lấy giá trị ra khỏi ngăn xếp, mà còn để trừ đi giá trị đó từ biến sum

Đầu tiên, chúng ta thêm một biến mới vào class. Đó sẽ là một biến private, giống như tất cả các biến trước đó. Tiếp theo, chúng ta thêm hai hàm push pop… Từ từ đã, nó có thực sự là “thêm” không ? Chúng ta đã có các hàm này trong class cha rồi. Chúng ta có thể xây dựng lại 2 hàm đó ở class con như thế không ?

Vâng, chúng ta có thể. Có nghĩa là chúng ta sẽ thay đổi nội dung xử lý của các hàm chứ không phải tên của chúng.

Chúng ta sẽ bắt đầu với hàm push. Đây là những gì chúng tôi mong đợi từ nó:

  • cộng thêm giá trị vào biến sum
  • đẩy giá trị lên ngăn xếp

hàm push mới sẽ như thế này →

Dòng đầu tiên của hàm thì đã quá rõ ràng và có lẽ không cần giải thích gì thêm. Nhưng dòng thứ hai trông có vẻ bí ẩn một chút phải không ? Nó có nghĩa là gì ?

Lưu ý rằng chúng ta không cần phải định nghĩa lại hoạt động push giá trị vào ngăn xếp một lần nữa. Việc triển khai cho hoạt động đó đã được thực hiện bên trong class Stack. Điều duy nhất chúng ta cần làm là sử dụng nó, nhưng chúng ta phải chỉ rõ class chứa hàm để tránh gây nhầm lẫn với bất kỳ hàm nào khác có cùng tên. Đó là lý do tại sao chúng ta phải đặt tiền tố “Stack ::” lên đằng trước lời gọi hàm.

Tương tự, hàm pop sẽ như thế này →


Có vẻ như chúng ta đã quên một thứ gì đó. Chúng ta định nghĩa biến sum nhưng nhưng lại chưa cung cấp phương thức để lấy được giá trị của nó. Nó đang bị ẩn. Chúng ta cần phải định nghĩa một hàm mới. Chúng ta sẽ gọi nó là “getSum“. Nhiệm vụ duy nhất của nó là trả về giá trị của biến sum. Hàm getSum này như sau →


Có một điều khác cần được xem xét, bạn có nhận thấy nó không ? Vâng, đó là về giá trị ban đầu của biến sum. Nó nên được khởi tạo bằng 0 khi đối tượng được tạo ra. Chúng ta có thể làm điều này trong constructor (hàm khởi tạo) của class AddingStack.

Chúng ta đã biết làm thế nào để tạo ra hàm constructor, nhưng có một điều cần phải được nhấn mạnh. Khi bạn tạo đối tượng của class AddingStack, bạn cũng nên quan tâm đến việc khởi tạo lớp cha của nó. Hãy xem constructor của  class AddingStack 

Lưu ý cụm từ “: Stack ()“. Đó là một lời gọi constructor của class cha trước khi constructor (của class con – AddingStack) bắt đầu công việc của nó.

Chúng ta hãy nhìn vào một mã hoàn chỉnh của class AddingStack ngay bây giờ.

Nó đây →

Chúng ta có thể kiểm tra chức năng của nó bây giờ. Chúng tôi sẽ làm điều đó với sự trợ giúp của một hàm main rất đơn giản. Nó ở trang tiếp theo 👉