12/08/2018, 13:51

Lập trình OOP với Java

OOP viết tắt của từ Object-Oriented Programming. Có nghĩa là lập trình hướng đối tượng. Ở OOP có 4 tính chất: Tính trừu tượng Tính kế thừa Tính đa hình Tính đóng gói Tính trừu tượng tức là việc tạo ra các abstract method trong interface hay abstract class. Mình chưa cần quan tâm cụ ...

OOP viết tắt của từ Object-Oriented Programming. Có nghĩa là lập trình hướng đối tượng.

Ở OOP có 4 tính chất:

  1. Tính trừu tượng
  2. Tính kế thừa
  3. Tính đa hình
  4. Tính đóng gói
  • Tính trừu tượng tức là việc tạo ra các abstract method trong interface hay abstract class. Mình chưa cần quan tâm cụ thể các class gồm có thuộc tính nào, các method thực hiện cụ thể ra sao. Ta chỉ cần khi báo ra tên của các abstract method để class con kế thừa mà thực hiện cụ thể các method đó. Mục đích của tính trừu tượng là tổng hợp lại những hành vi chung của thực thể.

  • Tính đóng gói là có khả năng đóng gói các thuộc tính, phương thức, dữ liệu của 1 đối tượng. Nó không cho phép truy cập trực tiếp đến dữ liệu mà nó phải thông qua các phương thức được đối tượng cung cấp để truy cập đến dữ liệu của chính nó. Đây là khả năng che dấu dữ liệu rất quan trọng trong lập trình hướng đối tượng.

  • Tính kế thừa là việc lớp con có thể sử dụng lại các thuộc tính, method của lớp cha hay thực hiện cụ thể các method abstract ở lớp cha (abstract method của abstract class với interface). Chính là bước mình extends class với implement interface. Mục đích của tính kế thừa để mở rộng, hạn chế lặp code

  • Tính đa hình tức là bước ở class con mình kế thừa class cha, mình có thể overried (ghi đè) lại method của class cha khi phương thức của lớp con có cùng tên và cùng tham số (cùng kiểu dữ liệu) với phương thức lớp cha. Hay mình cũng có thể overload lại method đã tồn lại trong cùng 1 lớp với tham số truyền vào method đó khác. Mục đích của tính đa hình là để triển khai cụ thể ở class con.

Để hiểu hơn về OOP, chúng ta cùng làm bài toán sau:

Một trường đại học quản lý thông tin cán bộ (gồm giảng viên và nhân viên hành chính) trong trường. Với giảng viên cần quản lý các thông tin: Họ tên, khoa, trình độ (cử nhân, thạc sĩ, tiến sĩ), phụ cấp, số tiết dạy trong tháng ,hệ số lương. Với nhân viên hành chính cần quản lý: Họ tên, phòng ban, số ngày công, hệ số lương, phụ cấp, chức vụ (trưởng phòng, phó phòng, nhân viên). Phụ cấp cán bộ được tính theo bảng: cử nhân 300. thạc sĩ 500. tiến sĩ 1000. trưởng phòng 2000. phó phòng 1000. nhân viên 500. Lương giảng viên được tính như sau: Hệ số lương x 730 + phụ cấp + số tiết dạy x 45. Lương nhân viên được tính như sau: Hệ số lương x 730 + phụ cấp + số ngày công x 30;

Viết chương trình quản lý thông tin cán bộ trong trường bao gồm các chức năng :

  1. Nhập dữ liệu cho các cán bộ trong trường.
  2. Tìm kiếm nhân viên theo tên và phòng ban và in ra màn hình thông tin chi tiết về nhân viên này.
  3. Xuất ra danh sách toàn bộ giảng viên trong trường và sắp xếp tên theo alphabet, nếu trùng tên thì sắp xếp theo lương nhận được từ cao xuống thấp. (Chú ý, danh sách cán bộ giảng viên, nhân viên được in cả cột thông tin lương) Yêu cầu: Áp dụng các kiến thức về lập trình hướng đối tượng để xây dựng chương trình. Sử dụng thành thạo tính chất trừu tượng, đóng gói, đa hình, kế thừa và áp dụng được abstract class và interface trong bài làm. Hàm main chỉ thực hiện gọi đến các chức năng mà không cần viết nghiệp vụ nào khác.

Đây là code của mình xử lý bài toán trên: https://github.com/nguyenvanthieub/OOP

Ở đây, mình đã tạo interface ICanBo với abstract method tinhLuong()

package base;

public interface ICanBo {

	public float tinhLuong();

}

Để cho 2 class con GiangVien và NhanVien kết thừa (implements ICanBo) (thể hiện tính kế thừa).

Bởi vì thấy cả GiangVien và NhanVien đều có chung các thuộc tính: hoTen, heSoLuong, phuCap, luong. Mình đã tạo abstract class CanBo, để cho class GiangVien và NhanVien kế thừa để tránh bị lặp code để cả class GiangVien, NhanVien đều phải viết (thể hiện tính trừu tượng)

package base;

import java.io.Serializable;

public abstract class CanBo implements Serializable{

	private String hoTen;
	private float heSoLuong;
	private float phuCap;
	private float luong;

	public String getHoTen(){
		return this.hoTen;
	}

	public void setHoTen(String hoTen){
		this.hoTen = hoTen;
	}

	public float getHeSoLuong(){
		return this.heSoLuong;
	}

	public void setHeSoLuong(float heSoLuong){
		this.heSoLuong = heSoLuong;
	}

	public float getPhuCap(){
		return this.phuCap;
	}

	public void setPhuCap(float phuCap){
		this.phuCap = phuCap;
	}

	public float getLuong(){
		return this.luong;
	}

	public void setLuong(float luong){
		this.luong = luong;
	}

}

Từ đó, 2 class con GiangVien và NhanVien tự xử lý lại (override) method tinhLuong() cho phù hợp với bài toán. (thể hiện tính đa hình) Ví dụ dưới là class NhanVien

package detail;

import base.CanBo;
import base.ICanBo;
import util.MyEnum.CHUCVU;

public class NhanVien extends CanBo implements ICanBo {

	private String phongBan;
	private CHUCVU chucVu;
	private int soNgayCong;

	@Override
	public float tinhLuong() {
		return this.getHeSoLuong() * 730 + this.getPhuCap() + this.getSoNgayCong() * 30;
	}

	public String getPhongBan(){
		return this.phongBan;
	}

	public void setPhongBan(String phongBan){
		this.phongBan = phongBan;
	}

	public CHUCVU getChucVu() {
		return this.chucVu;
	}

	public void setChucVu(CHUCVU chucVu) {
		this.chucVu = chucVu;
	}

	public int getSoNgayCong() {
		return this.soNgayCong;
	}

	public void setSoNgayCong(int soNgayCong) {
		this.soNgayCong = soNgayCong;
	}

}

Để đảm bảo tính đóng gói, mình đã để các thuộc tính là private, các class khác muốn truy cấp tới thuộc tính của NhanVien thì phải thông qua getter, setter mình đã tạo.

0