Giải bài tập : Kế thừa

Trong bài này kynangcntt.info hướng dẫn các bạn cách giải quyết ĐỀ BÀI 1 ở phần 2.

Trong Netbean IDE, tạo mới một project đặt tên là QLyThuVien.

Tiếp đến các bạn cần xây dựng lớp cha là TaiLieu chứa các thuộc tính chung cho các lớp Sách, Báo, Tạp chí như sau:

package kynangcntt.info;

/**
 *
 * @author kynangcntt.info
 */
public class TaiLieu {
    private String maTaiLieu,tenNhaXuatBan;
    private int soBanPhatHanh;

    public TaiLieu() {
    }

    public TaiLieu(String maTaiLieu, String tenNhaXuatBan, int soBanPhatHanh) {
        this.maTaiLieu = maTaiLieu;
        this.tenNhaXuatBan = tenNhaXuatBan;
        this.soBanPhatHanh = soBanPhatHanh;
    }

    public String getMaTaiLieu() {
        return maTaiLieu;
    }

    public void setMaTaiLieu(String maTaiLieu) {
        this.maTaiLieu = maTaiLieu;
    }

    public String getTenNhaXuatBan() {
        return tenNhaXuatBan;
    }

    public void setTenNhaXuatBan(String tenNhaXuatBan) {
        this.tenNhaXuatBan = tenNhaXuatBan;
    }

    public int getSoBanPhatHanh() {
        return soBanPhatHanh;
    }

    public void setSoBanPhatHanh(int soBanPhatHanh) {
        this.soBanPhatHanh = soBanPhatHanh;
    }        
}

Sau khi xây dựng thành công lớp TaiLieu các bạn lần lượt tạo các lớp Sach, TapChi, Bao kế thừa lớp TaiLieu, đồng thời định nghĩa các thuộc tính tương ứng với từng lớp như sau:

Định nghĩa lớp Sach:

package kynangcntt.info;

/**
 *
 * @author kynangcntt.info
 */
public class Sach extends TaiLieu{
    private String tenTacGia,tenSach;
    private int soTrang;

    public Sach() {
    }

    public Sach(String tenTacGia, String tenSach, int soTrang, String maTaiLieu, String tenNhaXuatBan, int soBanPhatHanh) {
        super(maTaiLieu, tenNhaXuatBan, soBanPhatHanh);
        this.tenTacGia = tenTacGia;
        this.tenSach = tenSach;
        this.soTrang = soTrang;
    }

    public String getTenTacGia() {
        return tenTacGia;
    }

    public void setTenTacGia(String tenTacGia) {
        this.tenTacGia = tenTacGia;
    }

    public String getTenSach() {
        return tenSach;
    }

    public void setTenSach(String tenSach) {
        this.tenSach = tenSach;
    }

    public int getSoTrang() {
        return soTrang;
    }

    public void setSoTrang(int soTrang) {
        this.soTrang = soTrang;
    }
}

Định nghĩa lớp TapChi:

package kynangcntt.info;

/**
 *
 * @author kynangcntt.info
 */
public class TapChi extends TaiLieu{
    private int soPhatHanh,thangPhatHanh;

    public TapChi() {
    }

    public TapChi(int soPhatHanh, int thangPhatHanh, String maTaiLieu, String tenNhaXuatBan, int soBanPhatHanh) {
        super(maTaiLieu, tenNhaXuatBan, soBanPhatHanh);
        this.soPhatHanh = soPhatHanh;
        this.thangPhatHanh = thangPhatHanh;
    }

    public int getSoPhatHanh() {
        return soPhatHanh;
    }

    public void setSoPhatHanh(int soPhatHanh) {
        this.soPhatHanh = soPhatHanh;
    }

    public int getThangPhatHanh() {
        return thangPhatHanh;
    }

    public void setThangPhatHanh(int thangPhatHanh) {
        this.thangPhatHanh = thangPhatHanh;
    }    
}

Định nghĩa lớp Bao:

package kynangcntt.info;

import java.util.Date;

/**
 *
 * @author kynangcntt.info
 */
public class Bao extends TaiLieu{
    private Date ngayPhatHanh;

    public Bao() {
    }

    public Bao(Date ngayPhatHanh, String maTaiLieu, String tenNhaXuatBan, int soBanPhatHanh) {
        super(maTaiLieu, tenNhaXuatBan, soBanPhatHanh);
        this.ngayPhatHanh = ngayPhatHanh;
    }

    public Date getNgayPhatHanh() {
        return ngayPhatHanh;
    }

    public void setNgayPhatHanh(Date ngayPhatHanh) {
        this.ngayPhatHanh = ngayPhatHanh;
    }        
}

Đến lúc này kynangcntt.com.vn đã hướng dẫn các bạn tạo xong các lớp cần thiết, bây giờ các bạn tiếp tục tạo lớp QuanLyThuVien để định nghĩa các phương thức nhằm cung cấp các chức năng cho hệ thống của mình tương tự như sau:

package kynangcntt.com.vn;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author kynangcntt.info
 */
public class QuanLyThuVien {
    private ArrayList<TaiLieu> taiLieus;
    private Scanner reader;

    public QuanLyThuVien() {
        taiLieus = new ArrayList<>();
        reader = new Scanner(System.in);
    }
    
    public Sach taoMoiSach(){
        Sach s = new Sach();
        System.out.println("Mã tài liệu: ");
        s.setMaTaiLieu(reader.nextLine());
        System.out.println("Tên nhà xuất bản: ");
        s.setTenNhaXuatBan(reader.nextLine());
        System.out.println("Số bản phát hành: ");
        s.setSoBanPhatHanh(Integer.parseInt(reader.nextLine()));
        System.out.println("Tên tác giả: ");
        s.setTenTacGia(reader.nextLine());
        System.out.println("Tên sách: ");
        s.setTenSach(reader.nextLine());
        System.out.println("Số trang: ");
        s.setSoTrang(Integer.parseInt(reader.nextLine()));
        return s;
    }
    public TapChi taoMoiTapChi(){
        TapChi tapChi = new TapChi();
        System.out.println("Mã tài liệu: ");
        tapChi.setMaTaiLieu(reader.nextLine());
        System.out.println("Tên nhà xuất bản: ");
        tapChi.setTenNhaXuatBan(reader.nextLine());
        System.out.println("Số bản phát hành: ");
        tapChi.setSoBanPhatHanh(Integer.parseInt(reader.nextLine()));
        System.out.println("Số phát hành: ");
        tapChi.setSoPhatHanh(Integer.parseInt(reader.nextLine()));
        System.out.println("Tháng phát hành: ");
        tapChi.setThangPhatHanh(Integer.parseInt(reader.nextLine()));
        return tapChi;
    }
    
    public Bao taoMoiBao(){
        Bao bao = new Bao();
        System.out.println("Mã tài liệu: ");
        bao.setMaTaiLieu(reader.nextLine());
        System.out.println("Tên nhà xuất bản: ");
        bao.setTenNhaXuatBan(reader.nextLine());
        System.out.println("Số bản phát hành: ");
        bao.setSoBanPhatHanh(Integer.parseInt(reader.nextLine()));
        System.out.println("Ngày phát hành: ");
        bao.setNgayPhatHanh(convertStringToDate(reader.nextLine()));        
        return bao;
    }

    private Date convertStringToDate(String ddMMyyyy) {
        try {
            return new SimpleDateFormat("dd/MM/yyyy").parse(ddMMyyyy);
        } catch (ParseException ex) {
            Logger.getLogger(QuanLyThuVien.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    public void nhapDanhSachTaiLieu(){
        System.out.println("Nhập 1 - Tạo mới sách");
        System.out.println("Nhập 2 - Tạo mới tạp chí");
        System.out.println("Nhập 3 - Tạo mới báo");
        System.out.println("Nhập 4 - Kết thúc");
        
        int selectedValue;
        
        do {            
            System.out.println("Bạn chọn: ");
            selectedValue = Integer.parseInt(reader.nextLine());
            
            switch(selectedValue){
                case 1:
                    taiLieus.add(taoMoiSach());
                    break;
                case 2:
                    taiLieus.add(taoMoiTapChi());
                    break;
                case 3:
                    taiLieus.add(taoMoiBao());
                    break;
            }
        } while (selectedValue!=4);
    }
    
    private void xuatThongTin(TaiLieu taiLieu){
        System.out.println("Mã tài liệu: " + taiLieu.getMaTaiLieu());
        System.out.println("Tên nhà xuất bản: " + taiLieu.getTenNhaXuatBan());
        System.out.println("Số bản phát hành: " + taiLieu.getSoBanPhatHanh());
        
        if (taiLieu instanceof Sach) {
            Sach sach = (Sach) taiLieu;
            System.out.println("Tên tác giả: " + sach.getTenTacGia());
            System.out.println("Tên sách: " + sach.getTenSach());
            System.out.println("Số trang: " + sach.getSoTrang());
        }else{
            if (taiLieu instanceof TapChi) {
                TapChi tapChi = (TapChi) taiLieu;
                System.out.println("Số phát hành: " + tapChi.getSoPhatHanh());
                System.out.println("Tháng phát hành:" + tapChi.getThangPhatHanh());
            }else{
                Bao bao = (Bao)taiLieu;
                System.out.println("Ngày phát hành"+ convertDateToString(bao.getNgayPhatHanh()));
            }
        }
    }

    private String convertDateToString(Date ngayPhatHanh) {
        return new SimpleDateFormat("dd/MM/yyyy").format(ngayPhatHanh);
    }
    
    public void xuatDanhSachTaiLieu(){
        for (TaiLieu taiLieu : taiLieus) {
            xuatThongTin(taiLieu);
        }
    }
    
    public void timTheoLoai(String loai){
        if (loai.equalsIgnoreCase("Sach")) {
            for (TaiLieu taiLieu : taiLieus) {
                if (taiLieu instanceof Sach) {                    
                    xuatThongTin(taiLieu);
                }
            }
        } else {
            if (loai.equalsIgnoreCase("Tap Chi")) {
                for (TaiLieu taiLieu : taiLieus) {
                    if (taiLieu instanceof TapChi) {
                        xuatThongTin(taiLieu);
                    }
                }
            } else {
                for (TaiLieu taiLieu : taiLieus) {
                    if (taiLieu instanceof Bao) {
                        xuatThongTin(taiLieu);
                    }
                }
            }
        }
    }
    
    public void timGanDungTheoTenSach(String str){
        for (TaiLieu taiLieu : taiLieus) {
            if (taiLieu instanceof Sach) {
                Sach sach = (Sach) taiLieu;
                if (sach.getTenSach().indexOf(str)!=-1) {
                    xuatThongTin(taiLieu);
                }
            }
        }
    }
    
    
    public static void main(String[] args) {
        Scanner input    = new Scanner(System.in);
        
        QuanLyThuVien quanLyThuVien = new QuanLyThuVien();
        quanLyThuVien.nhapDanhSachTaiLieu();
        quanLyThuVien.xuatDanhSachTaiLieu();
        
        System.out.println("Nhập loại bạn muốn tìm: ");
        quanLyThuVien.timTheoLoai(input.nextLine());
    }

Bài tiếp theo : Lập trình Giao diện Java