Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 84 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
84
Dung lượng
1,92 MB
Nội dung
Bộ mơn Cơng nghệ phần mềm VIỆN CƠNG NGHỆ THƠNG TIN TRUYỀN THÔNG TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài 05 Kết tập kế thừa Cao Tuấn Dũng dungct@soict.hut.edu.vn Mục tiêu học • Giải thích khái niệm tái sử dụng mã nguồn • Chỉ chất, mơ tả khái niệm liên quan đến đến kết tập kế thừa • So sánh kết tập kế thừa • Biểu diễn kết tập kế thừa UML • Giải thích ngun lý kế thừa thứ tự khởi tạo, hủy bỏ đối tượng kế thừa • Áp dụng kỹ thuật, nguyên lý kết tập kết thừa ngơn ngữ lập trình Java Nội dung Tái sử dụng mã nguồn Kết tập (Aggregation) Kế thừa (Inheritance) Tái sử dụng mã nguồn (Re-usability) • Tái sử dụng mã nguồn: Sử dụng lại mã nguồn viết ▫ Lập trình cấu trúc: Tái sử dụng hàm/chương trình ▫ OOP: Khi mô hình giới thực, tồn nhiều loại đối tượng có thuộc tính hành vi tương tự liên quan đến Làm để tái sử dụng lớp viết? Tái sử dụng mã nguồn (2) • Các cách sử dụng lại lớp có: ▫ Sao chép lớp cũ thành lớp khác Dư thừa và khó quản lý có thay chép đổi ▫ Tạo lớp mới tập hợp sử dụng đối tượng lớp cũ có Kết tập (Aggregation) ▫ Tạo lớp mới sở phát triển từ lớp cũ có Kế thừa (Inheritance) Tái sử dụng mã nguồn (2) • Ưu điểm ▫ Giảm thiểu công sức, chi phí ▫ Nâng cao chất lượng phần mềm ▫ Nâng cao khả mô hình hóa giới thực ▫ Nâng cao khả bảo trì (maintainability) Nội dung Tái sử dụng mã nguồn Kết tập (Aggregation) Kế thừa (Inheritance) Kết tập • Ví dụ: ▫ Điểm Tứ giác gồm điểm Kết tập • Kết tập ▫ Quan hệ chứa/có (“has-a”) phần (is-a-part-of) 2.1 Bản chất kết tập • Kết tập (aggregate) ▫ Các thành phần lớp mới đối tượng lớp có sẵn ▫ Kết tập tái sử dụng thơng qua đối tượng • Lớp mới ▫ Lớp toàn thể (Aggregate/Whole), • Lớp cũ ▫ Lớp thành phần (Part) 10 2.1 Bản chất kết tập (2) • Lớp tồn thể chứa đối tượng lớp thành phần ▫ Là phần (is-a-part of) lớp toàn thể ▫ Tái sử dụng thành phần liệu hành vi lớp thành phần thông qua đối tượng thành phần 70 Định nghĩa lớp • Nhược điểm: trực tiếp truy nhập thành viên liệu lớp sở ▫ thiếu tính đóng gói : phải biết sâu chi tiết lớp sở phải can thiệp sâu ▫ không tái sử dụng mã khởi tạo lớp sở ▫ khởi tạo thành viên private lớp sở khơng có quyền truy nhập • Nguyên tắc: đối tượng thuộc lớp bao gồm đối tượng lớp cha cộng thêm tính bổ sung lớp ▫ thể lớp sở tạo trước, sau "gắn" thêm tính bở sung lớp dẫn xuất • Vậy, ta sử dụng constructor lớp sở 71 Định nghĩa lớp • Để sử dụng constructor lớp sở, ta dùng danh sách khởi tạo constructor (tương tự khởi tạo thành viên) ▫ cách để tạo phần thuộc thể lớp cha tạo Car::Car(int vin, string make, string model, int passengers) trước : MotorVehicle(vin, make, model) { this->passengers = passengers; } Ta không cần khởi tạo thành viên vin, make, model từ bên constructor của Car Gọi constructor của MotorVehicle với tham số vin, make, model 72 Định nghĩa lớp • Để đảm bảo thể lớp sở tạo trước, ta bỏ qua lời gọi constructor lớp sở danh sách khởi tạo lớp dẫn xuất, trình biên dịch tự động chèn thêm lời gọi constructor mặc định lớp sở • Tuy ta cần gọi constructor lớp sở cách tường minh, destructor lớp dẫn xuất, lời gọi tượng tự cho destructor lớp sở không cần thiết ▫ việc thực tự động 73 Định nghĩa lớp class Truck : publictự MotorVehicle • Tương chúng {ta có định nghĩa lớp Truck public: sau Truck (int vin, string make, string model, int maxPayload); ~Truck(); Truck::Truck(int vin, string make, string model, void Load(); int maxPayload) void Unload(); : MotorVehicle(vin, make, model) private: { int maxPayload; this->maxPayload = maxPayload; }; } Truck::~Truck() {} void Truck::Load() {…} void Truck::Unload() {…} 74 Truy cập tới thành viên kế thừa • Truy cập tới thành viên kế thừa phụ thuộc không vào việc chúng khai báo với từ khóa public, protected hay private base class • Access phụ thuộc vào kiểu kế thừa - public, protected hay private – Kiểu kế thừa xác định định nghĩa của lớp dẫn xuất 75 Kế thừa public • Public inheritance có nghĩa: ▫ public members base class trở thành public members derived class; ▫ protected members base class trở thành protected members derived class; ▫ private members base class truy cập derived class 76 Ví dụ • Giả sử có hai lớp kế thừa sau Building Class - rooms: int - floors: int House Class - bedrooms: int - bathrooms: int class Building { public: void setRooms(int numRooms); int getRooms() const; void setFloors(int numFloors); int getFloors() const; private: // ?? int rooms; // Number of rooms int floors; // Number of floors }; class House : public Building { public: void setBedrooms(int numBedrooms); int getBedrooms() const; void setBathrooms(int numBathrooms); int getBathrooms() const; private: int bedrooms; // Number of bedrooms int bathrooms; // Number of bathrooms }; 77 Không truy cập từ lớp Dẫn xuất => chuyển thành : protected 78 Lớp MotorVehicle Truck • Quay lại thừa kế với MotorVehicle lớp sở ▫ Mọi thành viên liệu khai báo private, chúng truy nhập từ thể MotorVehicle ▫ tất lớp dẫn xuất khơng có quyền truy nhập thành viên private MotorVehicle • Vậy, đoạn mã sau có lỗi class MotorVehicle { private: int vin; string make; string model; }; void Truck::Load() { if (this->make == “Ford”) { } } 79 Lớp MotorVehicle Truck • Giả sử ta muốn lớp MotorVehicle truy nhập liệu • Thay từ khố private protected, • Đoạn mã sau khơng cịn lỗi class MotorVehicle { protected: int vin; string make; string model; }; void Truck::Load() { if (this->make == “Ford”) { } } 80 Kế thừa protected ▫ public members base class trở thành protected members derived class; ▫ protected members base class trở thành protected members derived class; ▫ private members base class truy cập derived class ▫ quan hệ thừa kế nhìn thấy từ phương thức bên Car, phương thức thuộc lớp Ca ▫ Tuy nhiên, đối tượng khác C++ không nhìn thấy quan hệ 81 Private inheritance ▫ public members base class trở thành private members derived class; ▫ protected members base class trở thành private derived class; ▫ private members base class truy cập derived class ▫ có chính thể đó biết nó thừa kế từ lớp cha ▫ các đối tượng bên ngoài tương tác với lớp với lớp cha, vì thành viên thừa kế trở thành private lớp ▫ Có thể dùng thừa kế private để tạo lớp có chức lớp cha lại không cho bên ngoài biết các chức đó 82 83 Chú ý Bài tập tuần • Bài làm giống – điểm • CNPM: Ngơ Thị Hà = Hồng Hải Nam=Nguyễn Hồng Nhung • CNPM: Nguyễn Hữu Mạnh = Hồng Hải Nam (bài complex, mydate chép đó) • CNPM: Ngơ Văn Phú = Hồ Văn Hiền • CNPM: Nguyễn Văn Tự (Tin Pháp) = Đặng Minh Sang = Nguyễn Minh Tuyền (chep doc, ppt) • CNPM: Nơng Việt Dũng = Ngơ Thị Bích Thuận • HTTT: Trần Đức Việt=Trần Khắc Giao=Vũ Văn Tốn • KTMT: Hồng Văn Hùng = Nguyễn Tiệp Anh • KTMT: Đậu Hồng Nhật = Nguyễn Đình Thiện: • HTTT: Nguyễn Tiến Dũng = Đậu Thanh bình HTTT = Nguyễn Thế cường: • Hồng Thanh Tùng HTTT =Trần Bình KTMT: • Đỗ Đức Đơng HTTT=Lê quang Vịnh: 84 Chú ý Bài tập tuần • • • • • • • • • • • • • Nhóm có doc, ppt giống nhau: 5đ Nguyễn Thành Luân Nguyễn Văn Thịnh Nguyễn Văn Tú Nguyễn Xuân Thịnh Trần Ngọc Mạnh Vũ Tuấn Anh (Trung tâm mạng) Trương Đức Nhật Nguyễn Quang Hải (KTMT) Vũ Tuấn Thanh có doc giống Nguyễn Văn Tiến 2007885: Trương Minh Khơi KTMT, Hoàng Thị Kim Nhung TTM giống doc, ppt KTMT: Hồng Văn Hùng = Nguyễn Tiệp Anh • Vũ Việt Dũng(HTTT) = Đỗ Đức Đông (HTTT) doc ... tạo kết tập • Khi đối tượng tạo mới, thuộc tính đối tượng phải khởi tạo gán giá trị tương ứng • Các đối tượng thành phần khởi tạo trước Các phương thức khởi tạo lớp đối tượng thành phần thực... dụng mã nguồn: Sử dụng lại mã nguồn viết ▫ Lập trình cấu trúc: Tái sử dụng hàm/chương trình ▫ OOP: Khi mô hình giới thực, tồn nhiều loại đối tượng có thuộc tính hành vi tương tự liên quan... Bản chất kết tập • Kết tập (aggregate) ▫ Các thành phần lớp mới đối tượng lớp có sẵn ▫ Kết tập tái sử dụng thơng qua đối tượng • Lớp mới ▫ Lớp toàn thể (Aggregate/Whole), • Lớp cũ ▫