Tớnh kế thừa trong Java

Một phần của tài liệu Bài giảng ngôn ngữ lập trình Java doc (Trang 55 - 59)

Để theo dừi tớnh kế thừa trong Java được cài đặt như thế nào, trong phần này chỳng ta sẽ xem xột một vớ dụ về quản lý nhõn sự tại một cụng ty.

VI.1 Sự kế thừa cỏc thuộc tớnh và phương thức

Giả sử trong cụng ty, đội ngũ quản lý (managers) được đối xử khỏc với nhõn viờn (employees) bỡnh thường. Lớp Employee được định nghĩa như sau:

import java.util.Date;

import java.util.GregorianCalendar; class Employee

{

// Phương thức khởi tạo

public Employee(String n, double s, int year, int month, int day) {

HoVaTen = n; Luong = s;

GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); // GregorianCalendar coi 0 là Thỏng 1

NgayBatDau = calendar.getTime(); }

// Phương thức lấy họ tờn public String getHoVaTen() {

return HoVaTen; }

// Phương thức lấy lương public double getLuong() {

return Luong; }

//phương thức lấy ngày bắt đầu làm việc public Date getNgayBatDau()

{

return NgayBatDau; }

// Phương thức tăng lương

public void raiseSalary(double PhanTram) {

double PhanTang = Luong * PhanTram / 100; Luong += PhanTang;

}

// Cỏc thuộc tớnh thành phần private String HoVaTen; private double Luong; private Date NgayBatDau; }

Ta thấy rằng cả Manager và Employee đều cú những điểm chung về mặt quản lý như họ cựng được trả lương. Tuy nhiờn, với Employee chỉ được trả lương theo một hợp đồng cú sẵn trong khi Manager ngoài lương ra cũn được hưởng một khoản tiền thưởng. Đõy chớnh là ngữ cảnh tốt để cài đặt tớnh kế thừa.

Chỳng ta sẽ thiết kế một lớp Manager nhưng kế thừa lại những gỡ đó viết ở lớp Employee. class Manager extends Employee

{

//Cỏc thuộc tớnh và phương thức bổ sung }

Từ khúa extends xỏc định rằng chỳng ta đang tạo ra một lớp mới được dẫn xuất từ một lớp đang tồn tại. Lớp đang tồn tại cũn được gọi là lớp cha, supperclass, hoặc lớp cơ sở (base class), lớp kế thừa cũn được gọi là lớp dẫn xuất, lớp con. Cỏc lớp dẫn xuất thường được cài đặt nhiều tớnh năng hơn lớp cha.

Lớp Manager cú thờm thuộc tớnh TienThuong và phương thức để thiết đặt giỏ trị cho nú: class Manager extends Employee

{ . . .

public void setTienThuong(double b) {

TienThuong = b; }

private double TienThuong; }

Việc sử dụng cỏc thuộc tớnh và phương thức này khụng cú gỡ đặc biệt. Nếu ta cú một đối tượng Manager cú tờn boss, ta cú thể gọi:

boss.setTienThuong(10000);

Tất nhiờn là đối tượng của lớp Emplyee khụng thể gọi phương thức setTienThuong() vỡ nú khụng phải là phương thức được định nghĩa trong lớp Employee.

Tuy nhiờn, chỳng ta cú thể sử dụng cỏc phương thức getHoVaTen(), getLuong(), getNgayBatDau() đối với cỏc đối tượng của lớp Manager vỡ chỳng được tự động kế thừa từ lớp Employee. Tương tự như thế, cỏc thuộc tớnh HoVaTen, Luong và NgayBatDau cũng được kế thừa. Lớp Manager cú 4 thuộc tớnh là HoVaTen, Luong, NgayBatDau và TienThuong.

Đến đõy ta cú thể rỳt ra rằng khi thiết kế cỏc lớp trong Java, ta đặt cỏc thuộc tớnh và phương thức phổ biến vào cỏc lớp cha, lớp con chỉ việc khai bỏo thờm cỏc thuộc tớnh và phương thức đặc biệt.

Tuy nhiờn, một số phương thức của lớp cha cú thể khụng cũn phự hợp ở lớp con. Ở đõy, phương thức getLuong() đối với lớp Manager phải là tổng của Luong và TienThuong. Do đú, ta cần định nghĩa một phương thức mới trong lớp Manager đố lờn phương thức cũ:

class Manager extends Employee {

. . .

public double getLuong() {

. . . } . . . }

Chỳng ta cú thể nghĩ việc cài đặt cho phương thức mới này rất đơn giản như: public double getLuong()

{

return Luong + TienThuong; // Khụng thực hiện }

Tuy nhiờn nú khụng thực hiện. Lý do là vỡ sự truy cập vào Luong ở đõy là khụng hợp lệ. Thuộc tớnh Luong trong Employee được khai bỏo là private nờn chỉ cỏc phương thức trong lớp Employee mới được phộp truy cập. Theo lý thuyết, việc xỏc định cho cỏc thuộc tớnh lớp Employee cấp độ truy cập là protected cú vẻ là hợp lý. Tuy nhiờn điều này cú thể cho phộp tất cả cỏc lớp dẫn xuất từ Employee thay đổi giỏ trị cỏc thuộc tớnh này làm tớnh đúng gúi của OOP bị phỏ vỡ.

Đến đõy chỳng ta nghĩ rằng Luong phải được truy cập thụng qua một cơ chế public khỏc là phương thức getLuong() được định nghĩa public trong Employee.

public double getLuong() {

double LuongCoBan = getLuong(); // vẫn khụng thực hiện return LuongCoBan + TienThuong;

}

Tuy nhiờn, đoạn mó này cũng chưa thực hiện được. Lý do là phương thức getLuong() lỳc này được coi là chớnh phương thức getLuong() của lớp Manager nờn nú khụng cú tỏc dụng.

Để gọi được phương thức getLuong() của lớp Employee, ta dựng từ khúa super để chỉ lớp cha.

public double getLuong() {

double LuongCoBan = super.getLuong(); // OK return LuongCoBan + TienThuong;

}

Nếu khụng cho phộp lớp con kế thừa một phương thức của lớp cha, ta dựng từ khúa final khi khai bỏo phương thức.

VI.2 Sự kế thừa đối với cỏc constructor

Như đó đề cập, cỏc phương thức khởi tạo khụng được tự động kế thừa cho lớp con. Tuy nhiờn ta cú thể sử dụng phương thức khởi tạo của lớp cha để khởi tạo giỏ trị cho cỏc thuộc tớnh được kế thừa ở lớp con:

public Manager(String n, double s, int year, int month, int day) {

super(n, s, year, month, day); TienThuong = 0;

}

Ở đõy, super(n, s, year, month, day); thay cho việc gọi constructor của Employee với 5 tham số n, s, year, month và day. Lưu ý là lệnh gọi super phải là lệnh đầu tiờn trong phương thức constructor ở lớp con.

Đến đõy, ta đó cú một lớp Manager được định nghĩa đỳng đắn: class Manager extends Employee

{

// Phương thức khởi tạo

public Manager(String n, double s, int year, int month, int day) {

super(n, s, year, month, day); TienThuong = 0;

}

// Phương thức tớnh lương public double getLuong() {

double LuongCoBan = super.getLuong(); // OK return LuongCoBan + TienThuong;

}

//Phương thức đặt tiền thưởng

public void setTienThuong(double b) {

TienThuong = b; }

private double TienThuong; }

Một phần của tài liệu Bài giảng ngôn ngữ lập trình Java doc (Trang 55 - 59)