Bài giảng môn Lập trình hướng đối tượng - Chương 3: Lớp và đối tượng
Trừu tượng hoá dữ liệu Đóng gói và xây dựng lớp Tạo và sử dụng đối tượng Một số kĩ thuật xây dựng lớp và sử dụng đối tượng
Bạn đang xem trước 20 trang tài liệu Bài giảng môn Lập trình hướng đối tượng - Chương 3: Lớp và đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGCHƯƠNG 3LỚP VÀ ĐỐI TƯỢNGMục tiêu của bài họcNêu được bản chất, vai trò của trừu tượng hoáGiải thích về đóng gói và che dấu thông tinXây dựng lớpĐịnh nghĩa lớp, thực hiện ẩnTạo các phương thức, các trường/thuộc tínhTạo và sử dụng đối tượngPhương thức khởi tạoKhai báo và khởi tạo đối tượngSử dụng đối tượngNội dungTrừu tượng hoá dữ liệuĐóng gói và xây dựng lớpTạo và sử dụng đối tượngMột số kĩ thuật xây dựng lớp và sử dụng đối tượngNội dungTrừu tượng hoá dữ liệuĐóng gói và xây dựng lớpTạo và sử dụng đối tượngMột số kĩ thuật xây dựng lớp và sử dụng đối tượng1.1 Trừu tượng hoáGiảm thiểu và tinh lọc các chi tiết nhằm tập trung vào một số khái niệm/vấn đề quan tâm tại một thời điểm“abstraction”- a concept or idea not associated with any specific instanceVí dụ: các định nghĩa toán học2 loại trừu tượng hoáTrừu tượng hoá điều khiển (control abstraction)Trừu tượng hoá dữ liệu (data abstraction)1.1 Trừu tượng hoá (2)Trừu tượng hoá điều khiểm: sử dụng các chương trình con (sub program) và các luồng điều khiển (control flow)Ví dụ: a:=(1+2)*5Nếu không có trừu tượng hoá điều khiển thì lập trình viên phải chỉ ra tất cả các thanh ghi, các bước tính toán ở mức nhị phânTrừu tượng hoá dữ liệu: xử lý dữ liệu theo các cách khác nhauVí dụ: kiểu dữ liệuSự tách biệt rõ ràng giữa các thuộc tính trừu tượng của kiểu dữ liệu và các chi tiết thực thi cụ thể của kiểu dữ liệu đó1.2 Trừu tượng hoá dữ liệu trong OOPĐối tương trong thực tế phức tạpCần đơn giản hoá, bỏ qua những chi tiết ko cần thiếtChỉ “trích bút” lấy những thông tin liên quan, thông tin quan tâm, quan trọng với bài toánabstractioninfoThuộc tính: Màu sắc Kiểu dáng Hãng sx Kiểu động cơ Phương thức: Khởi động chạyTăng tốc 1.2 Trừu trượng hoá dữ liệu trong OOPAny model that include the most important, essential, or distinguishing aspects of something while suppressing or ignoring less important immaterial, or diversionary details. The result of removing distinctions so as emphasize commonalties Cho phép các nhà quản lý các bài toán phức tạp bằng cách tập trung vào các đặc trưng quan trọng của một thực thể nhằm phân biệt nó với các loại thực thể khác1.2 Trừu tượng hoá dữ liệu trong oopTrừu tượng hoá là một cách nhìn hoặc cách biểu diễn chr bao gồm các thuộc tính liên quan trong một ngữ cảnh nào đóTập hợp các thể hiện của các thực thể thành các nhóm có chung các thuộc tính gọi là lớp1.3 Lớp & đối tượngLớp là mô hình khái niệm mô tả các thực thểLớp như một bản mẫu, định nghĩa các thuộc tính và phương thức chung của các đối tượngMột lớp là sự trừu tượng hoá của một tập các đối tượngĐối tượng là sự vật thật, là thực thể thực sựĐối tượng là một thể hiện (instance) của một lớp, dữ liệu của các đối tượng khác nhau là khác nhauMỗi đối tượng có một lớp xác định dữ liệu và hành vi của nóBiểu diễn lớp trong UMLLớp (class) được biểu diễn bằng một hình chữ nhật cụ thể với 3 thành phầnTên lớpCấu trúc (thuộc tính)Hành vi (thao tác)Professor-nameemployeeIDStatusdiscipline+ submitFinalGrade()+ acceptCourseOffering()+ SetStatus()+teachClass ()Thuộc tính (attribute là gì)Một thuộc tính là một đặc tính được đặt tên của một lớp.Một lớp có thể không có thuộc tính nào hoặc có số lượng thuộc tính bất kỳ.Student-nameaddressstudentIDdateOfBirthattributesNội dungTrừu tượng hoá dữ liệuĐóng gói và xây dựng lớpTạo và sử dụng đối tượngMột số kĩ thuật xây dựng lớp và sử dụng đối tượng2.1 Đóng gói (Encapsulation)MethodsDataMột đối tượng có hai khung nhìn:Bên trong: Chi tiết về các thuộc tính và các phương thức của lớp tương ứng với đối tươngBên ngoài: Các dịch vụ mà một đối tượng có thể cung cấp và cách đối tượng đó tương tác với các phần còn lại của hệ thống2.1 Đóng góiDữ liệu/ thuộc tính và hành vi/phương thức được đóng gói trong một lớp EncapsulationProfessor-nameemployeeIDStatusdiscipline+ submitFinalGrade()+ acceptCourseOffering()+ SetStatus()+teachClass ()2.1 Đóng góiMột đối tượng là một thực thể được đóng gói, cung cáp tập các dịch vụ nhất địnhMột đối tượng được đóng góicó thể được xem như là một hộp đem – các công việc bên trong là ẩn so với clientInputDon’t know how it works, but it workOutputDù thay đổi thiết kế/ mã nguồn bên trong nhưng giao diện bên ngoài không thay đổi theo2.1 Xây dựng lớpThông tin cần thiết để định nghĩa một lớpTên (Name)Tên lớp nên mô tả đối tượng trong thế giới thậtTên lớp nên là số ít, ngắn gọn, và xác định rõ ràng cho sự trừu tượng hoáDanh sách các thuộc tínhCác đặc điểm cần lấy ra khi trừu tượng hoáDanh sách các thông điệp/phương thứcCác thông ddieepjj mà đối tượng đó có thể nhận đượcBankAccount-owner: String-balance:double+debit(double):boolean+credit(double)2.2 Xây dựng lớpCác lớp được nhóm lại thành packagePackage bao gồm một tập hợp các lớp có quan hệ logic với nhau,Package được coi như các thư mục, là nơi tổ chức các lớp, giúp xác định vị trí dễ dàng và sử dụng các lớp một cách phù hợpVí dụ:Một số package có sẵn của Java: java.lang; javax.swing; java.io;Package có thể do ta tự đặtCách nhau bằng dâu “.”Quy ước sử dụng ký tự thường để đặt tên packageVí dụ: package oop.k13.httt2.2.1 Khai báo lớpCú pháp khai báo:package tenpackage;Chi_thi_truy_cap class TenLop { // than lớp}chi_thi_truy_cap:public: lớp có thể được truy cập từ bất cứ đâu, kể cả bên ngoài package chứa lớp đóprivate: Lớp chỉ có thể truy cập trong phạm vi lớp đóKhông có (mặc định): lớp có thể được truy cập từ bên trong package chứa lớp đóVí dụ khai báo lớppackage oop.k12.httt;public class Student {.}2.2.2 Khai báo các thành viên của lớpCác thành viên của lớp cũng có các chỉ định truy cập tương tự như lớpPublicKhông cóprivateCùng lớpyesYesYesCùng góiYesYesNoKhác góiYesNoNo a. Thuộc tínhCac thuộc tính phải được khai báo bên trong lớpMỗi đối tượng có bản sao các thuộc tính của riêng nóGiá trị của một thuộc tính thuộc các đối tượng khác nhau là khác nhauStudent-name-address-studentID-dateOfBirtha. Thuộc tínhThuộc tính có thể được khởi tạo khi khai báoCác giá trị mặc định sẽ được sử dụng nếu không được khởi tạoBankAccount-owner: String-balance:double+debit(double):boolean+credit(double)package com.bank.model;public class BankAccount{ private string owner; private double balance = 0.0;} b. Phương thứcXác định cách một đối tượng đáp ứng một thông điệpPhương thức xác định cách hoạt động của lớpBất kỳ một phương thức nào cũng phải thuộc về một lớp nào đóVd: public boolean debit (double amount){ // method body // Java code that implements method behavior} Thành viên hằngMột thuộc tính không thể thay đổi giá trị trong quá trình sử dụng:Cú pháp khai báo: chi_thi_truy_cap final kieu_du_lieu TENHANG = gia_tri;Ví dụfinal double PI=3.14;public final int VAL_THREE =39;private final int[] A = {1, 2, 3, 4, 5, 6};2.3 Che giấu dữ liệuDữ liệu được che giấu ở bên trong lớp và chỉ được truy cập và thay đổi ở các phương thức bên ngoàiTránh thay đổi trai phép hoặc làm sai lệch dữ liệuPublicInterfaceInternalworkingThảo luận Đóng gói dữ liệu có phải là che dấu dữ liệu không?Cơ chế che dấu dữ liệuCác thành viên dữ liệu/thuộc tínhChỉ có thể truy cập từ các phương thức bên trong lớpChỉ định quy cập là private để được bảo vệCác đối tượng khác muốn truy cập vào dữ liệu riêng tư này phải thông qua một phương thức publicCơ chế che dấu dữ liệu Vì dữ liệu là riêng tư thông thường một lớp cung cấp các dịch vụ để truy cập và chỉnh sửa các giá trị của dữ liệuAccessor (getter): trả về giá trị hiện tại của một thuộc tính (dữ liệu)Mutator (setter): thay đổi giá trị của một thuộc tínhThường các phương thức này được đặt tên là getX và setX, trong đó X là tên thuộc tínhBài tập 1Viết mã nguồn cho lớp NhanVien trong hình bên biết:Lương =Lương Cơ bản * hệ sốPhương thức inTTin() hiển thị thông tin của đối tượngNhân viên tương ứngPhương thức tangLuong(double) tăng hệ số lương hiện tại lên một lượng bằng giá trị tham số double truyền vào. Nếu điều này làm cho lương của nhân viên > lương tối đa cho phép thì không cho phép thay đổi, in ra thông báo trả về và false, ngược lại trả về trueViết các phương thức get, set cho các thuộc tính của lớp NhanVienNhanVien-tenNhanVien-luongCoBan-heSoLuong-luongMax+tangLuong (double)+tinhLuong()+inTTin()Nội dungTrừu tượng hoá dữ liệuĐóng gói và xây dựng lớpTạo và sử dụng đối tượngMột số kĩ thuật xây dựng lớp và sử dụng đối tượng3.1 Khởi tạo dữ liệuDữ liệu cần được khởi tạo trược khi sử dụngLỗi khởi tạo là một trong cá lỗi phổ biếnVới kiểu dữ liệu đơn giản sử dụng toán tử =Với đối tượng cần dùng phương thức khởi tạoKhởi tạo và huỷ bỏ đối tượngMỗi đối tượng khi tồn tại và hoạt động được hệ điều hành cấp phát vùng nhớ để lưu lại các giá trị của dữ liệu thành phầnKhi tạo ra đối tượng HĐH sẽ gán giá trị khởi tạo cho các dữ liệu thành phầnPhải thực hiện tự động trước khi người lập trình có thể tác động lên đối tượngSử dụng hàm/phương thức khởi tạoNgược lại, khi kết thúc cần phải giải phóng hợp lý tất cả các bộ nhớ đã cấp phát cho đối tượngJava: JVMC++: Hàm huỷ (destructor)3.2 Phương thức khởi tạoLà phương thức đặc biệt được gọi tự động khi tạo ra đối tượngMục đích chính: Khởi tạo cho các thuộc tính của đối tươngMỗi lớp phải chứa ít nhất một constructorCó nhiệm vụ tạo ra một thể hiện mới của lớpTên constructor trùng với tên của lớpConstructor không có kiểu dữ liệu trả vềpublic BankAccount (String o, double b){ owner =o; balance = b; }3.2 Phương thức khởi tạoPhương thức khởi tạo có thể dùng các chỉ thị truy cậppublicprivatemặc địnhMột phương thức khởi tạo không thể dùng các từ khoá abstract, static, final, native, synchronizedCác phương thức khởi tạo không được xem như là thành viên của lớp3.2 Phương thức khởi tạoPhương thức khởi tạo mặc định (defaul constructor)Là phương thức khởi tạo không tham sốNếu ta không viết một phương thức khởi tạo nào trong lớpJVM mới cung cấp phương thức khởi tạo mặc địnhPhương thức khởi tạo mặc định do JVM cung cấp có chỉ định giống như lớp của nóMột lớp nên có phương thức khởi tạo mặc định3.3 Khai báo và khởi tạo đối tượngĐối tượng được tạo ra, thể hiện hoá (instantiate) từ một mẫu chung (lớp)Các đối tượng phải được khai báo kiểu của đối tượng trước khi sử dụng:Kiểu của đối tượng là lớp các đối tuonwgjVí dụString strName;BankAccount acc;3.3 Khai báo và khởi tạo đối tượngĐối tượng cần được khởi tạo trược khi sử dụngSử dụng toán tử = để gánSử dụng từ khoa new với constructor để khởi tạo đối tượng:Từ khoá new dùng để tạo ra một đối tượng mớiTự động gọi phương thức khởi tạo tương ứngMột đối tượng được khởi tạo mặc định là nullĐối tượng được thao tác thông qua tham chiếuVí dụBankAccount acc1;Acc1 = new BankAccount;3.3 Khai báo và khởi tạo đối tượngCó thể kết hợp vừa khai báo và khởi tạo đối tượngCú pháp: TenLop tenDoiTuong = new PthucKhoiTao (DSThamSo)3.3 Khai báo và khởi tạo đối tượngPhương thức khởi tạo Không có gía trị trả về, nhưng khi sử dụng với từ khoá new trả về một tham chiếu đến đối tượng mớiBankAccount account = new BankAccount(“Jhon”);3.4 Sử dụng đối tượngĐối tượng cung cấp các hoạt động phức tạp hơn các kiểu dữ liệu nguyên thuỷĐối tượng đáp ứng lại các thông điệmToán tử “.” được sử dụng để gửi một thông điệp đến một đối tượngVD: String name = “chao tat ca cac ban”;Name.substring(2,9);3.4 Sử dụng đối tượngĐể gọi thành viên (dữ liệu/thuộc tính) của lớp hoặc đối tưởng, sử dụng toán tử “.”Nếu gọi phương thức ngay trong lớp thì toán tử “.” không cần thiếtTự tham chiếu - thisCho phép truy cập vào đối tượng hiện tại của lớpQuan trong khi ham/phương thức thành phần thao tác trên hai hay nhiều đối tượngXoá đi sự nhập nhằng giữa biến cục bộ, tham số với thành phần dữ liệu của lớpKhông dùng bên trong các khối lệnh staticBài tập 2Viết mã nguồn cho lớp nhân NhanVienViết phương thức khởi tạo cho các thuộc tính của lớp NhanVienViết lớp TestNV, trong đó tạo ra hai đối tượng của lớp NhanVien, thực hiện truyền thông điệp đến các đối tượng vừa tạo để hiện thị thông tin, hiển thị lương, tăng lương.