1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình hướng đối tượng: Bài 7 - Một số kỹ thuật trong kế thừa

68 2 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 68
Dung lượng 1,07 MB

Nội dung

Bài giảng Lập trình hướng đối tượng: Bài 7 - Một số kỹ thuật trong kế thừa được biên soạn nhằm giúp các em sinh viên trình bày nguyên lý định nghĩa lại trong kế thừa; Phân biệt khái niệm đơn kế thừa và đa kế thừa; Giới thiệu về giao diện, lớp trừu tượng và vai trò của chúng; Ví dụ và bài tập về các vấn đề trên với ngôn ngữ lập trình Java. Mời các bạn cùng tham khảo bài giảng.

Bài 7: Một số kỹ thuật kế thừa Mục tiêu ❖ Trình bày nguyên lý định nghĩa lại kế thừa ❖ Phân biệt khái niệm đơn kế thừa đa kế thừa ❖ Giới thiệu giao diện, lớp trừu tượng vai trò chúng ❖ Ví dụ tập vấn đề với ngơn ngữ lập trình Java Nội dung Định nghĩa lại/ghi đè (Overriding) Lớp trừu tượng Đơn kế thừa & Đa kế thừa Giao diện (Interface) Vai trò lớp trừu tượng giao diện Ví dụ tập Nội dung Định nghĩa lại/ghi đè (Overriding) Lớp trừu tượng Đơn kế thừa & Đa kế thừa Giao diện (Interface) Vai trò lớp trừu tượng giao diện Ví dụ tập Định nghĩa lại/ghi đè (Overriding) ❖ Quan hệ kế thừa (inheritance) ▪ Lớp loại (is-a-kind-of) lớp cha ▪ Kế thừa thành phần liệu hành vi lớp cha ▪ Chi tiết hóa cho phù hợp với mục đích sử dụng mới: • Mở rộng lớp cha (Extension): Thêm thuộc tính/hành vi • Định nghĩa lại (Redefinition): Chỉnh sửa lại hành vi kế thừa từ lớp cha → Ghi đè (Method Overriding) Định nghĩa lại/ghi đè (Overriding) ❖ Phương thức ghi đè thay làm rõ cho phương thức tên lớp cha ❖ Đối tượng lớp hoạt động với phương thức phù hợp với Shape # name: String + getName(): String + calculateArea(): double 3.14 * radius * radius side * side Square Circle - side: double - radius: double + calculateArea(): double + calculateArea(): double Định nghĩa lại/ghi đè (Overriding) ❖ Cú pháp: Phương thức lớp hoàn toàn giống chữ ký với phương thức kế thừa lớp cha ▪ Trùng tên & danh sách tham số ▪ Mục đích: Để thể chất cơng việc ❖ Lớp định nghĩa phương thức trùng tên với phương thức lớp cha: Nếu phương thức trùng tên khác chữ ký (số lượng hay kiểu liệu đối số) → Chồng phương thức (Method Overloading) Nếu phương thức hoàn toàn giống giao diện (chữ ký) → Định nghĩa lại ghi đè phương thức (Method Override) Ví dụ (1) class Shape { protected String name; Shape(String n) { name = n; } public String getName() { return name; } public double calculateArea() { return 0.0; } } class Circle extends Shape { private double radius; Circle(String n, double r){ super(n); radius = r; } public double calculateArea() { double area = (double) (3.14 * radius * radius); return area; } } Ví dụ (2) class Square extends Shape { private double side; Square(String n, double s) { super(n); side = s; } public double calculateArea() { double area = (double) side * side; return area; } } Thêm lớp Triangle class Triangle extends Shape { private double base, height; Triangle(String n, double b, double h) { super(n); base = b; Muốn gọi lại phương thức height = h; lớp cha bị ghi đè ? } public double calculateArea() { double area = 0.5f * base * height; return area; } } 10 Ví dụ Java Interface – default methods https://gpcoder.com/3854-interface-trong-java-8default-method-va-static-method/ public interface Shape { void draw(); default void setColor(String color) { System.out.println("Draw shape with color " + color); } } 54 Đa thừa kế interface Interface1 { default void doSomething() { System.out.println("doSomething1"); } } interface Interface2 { default void doSomething() { System.out.println("doSomething2"); } } public class MultiInheritance implements Interface1, Interface2 { @Override public void doSomething() { Interface1.super.doSomething(); } } 55 Đa thừa kế interface Interface3 { default void doSomething() { System.out.println("Execute in Interface3"); } } class Parent { public void doSomething() { System.out.println("Execute in Parent"); } } public class MultiInheritance2 extends Parent implements Interface3 { public static void main(String[] args) { MultiInheritance2 m = new MultiInheritance2(); m.doSomething(); // Execute in Parent } } 56 Ví dụ Java interface – Static methods interface Vehicle { default void print() { if (isValid()) System.out.println("Vehicle printed"); } static boolean isValid() { System.out.println("Vehicle is valid"); return true; } void showLog(); } public class Car implements Vehicle { @Override public void showLog() { print(); Vehicle.isValid(); } } 57 Ví dụ với static method interface Interface3 { default void doSomething() { System.out.println("Execute in Interface3"); } } abstract class Parent { public void doSomething() { System.out.println("Execute in Parent"); } public static void test() { System.out.println("test"); } } public class MultiInheritance2 extends Parent implements Interface3 { public static void main(String[] args) { MultiInheritance2 m = new MultiInheritance2(); m.doSomething(); // Execute in Parent } } m.test(); // OK 58 Ví dụ với static method interface Interface3 { default void doSomething() { System.out.println("Execute in Interface3"); } } abstract class Parent { public void doSomething() { System.out.println("Execute in Parent"); } public static void test() { System.out.println("test"); } } public class MultiInheritance2 extends Parent implements Interface3 { public static void main(String[] args) { MultiInheritance2 m = new MultiInheritance2(); } } m.test(); // OK 59 Ví dụ với static method interface Interface3 { default void doSomething() { System.out.println("Execute in Interface3"); } } abstract class Parent { public void doSomething() { System.out.println("Execute in Parent"); } public static void test() { System.out.println("test"); } } public class MultiInheritance2 extends Parent implements Interface3 { public static void main(String[] args) { MultiInheritance2 m = new MultiInheritance2(); } } MultiInheritance2.test(); // OK 60 Ví dụ với static method interface Interface3 { default void doSomething() { System.out.println("Execute in Interface3"); } public static void test() { System.out.println("test"); } } abstract class Parent { public void doSomething() { System.out.println("Execute in Parent"); } } public class MultiInheritance2 extends Parent implements Interface3 { public static void main(String[] args) { MultiInheritance2 m = new MultiInheritance2(); } } m.test(); // ERROR!!! 61 Ví dụ với static method interface Interface3 { default void doSomething() { System.out.println("Execute in Interface3"); } public static void test() { System.out.println("test"); } } abstract class Parent { public void doSomething() { System.out.println("Execute in Parent"); } } public class MultiInheritance2 extends Parent implements Interface3 { public static void main(String[] args) { MultiInheritance2 m = new MultiInheritance2(); } } MultiInheritance2.test(); // ERROR!!! 62 Tổng kết ❖ Ghi đè ▪ Các phương thức lớp có chữ ký danh sách tham số với phương thức lớp cha, tạo để định nghĩa lại hành vi lớp ❖ Lớp trừu tượng ▪ Các lớp không khởi tạo đối tượng, tạo làm lớp sở cho lớp định nghĩa rõ ▪ Có phương thức trừu tượng ❖ Giao diện ▪ Định nghĩa phương thức mà lớp thực thi phải cài đặt ▪ Giải vấn đề đa kế thừa 63 Nội dung Định nghĩa lại/ghi đè (Overriding) Lớp trừu tượng Đơn kế thừa & Đa kế thừa Giao diện (Interface) Vai trị lớp trừu tượng giao diện Ví dụ tập 64 Bài tập ❖ Sửa lại lớp NhanVien: ▪ thuộc tính khơng hằng NhanVien kế thừa lại cho lớp TruongPhong ❖ Viết mã nguồn lớp TruongPhong hình vẽ ▪ Viết phương thức khởi tạo cần thiết để khởi tạo thuộc tính lớp TruongPhong ▪ Lương trưởng phịng = Lương Cơ * hệ số lương + phụ cấp NhanVien #tenNhanVien:String #heSoLuong:double +LUONG_CO_BAN:double=750.000 +LUONG_MAX:double=20.000.000 +tangLuong(double):boolean +tinhLuong():double +inTTin() TruongPhong -phuCap:double -soNamDuongChuc:double +tinhLuong():double +inTTin() 65 Bài tập ❖ Viết lớp GiamDoc cài đặt giao diện QuanLy ▪ ▪ Hoa hồng giám đốc tính 5% lợi nhuận cơng ty ▪ Lương giám đốc = lương * hệ số lương + phụ cấp + hoa hồng Tương tự, xây dựng lớp CanBo QuanLy kế thừa lớp NhanVien thực thi giao diện QuanLy ▪ Hoa hồng tính 0.2% lợi nhuận cơng ty ▪ CanBoQuanLy khơng có phụ cấp NhanVien - tenNhanVien: String - luongCoBan: double - heSoLuong: double + LUONG_MAX: double QuanLy + tangHeSoLuong(double): boolean + tinhLuong(): double + tinhHoaHong(): double + inTTin() GiamDoc - phuCap: double + loiNhuanCongTy: double + tinhLuong(): double + inTTin() Bài tập ❖ Xây dựng lớp theo sơ đồ lớp 67 68 ... đa kế thừa A B C D ❖ Đơn kế thừa (Single Inheritance) ▪ Một lớp kế thừa từ lớp cha trực tiếp ▪ Java hỗ trợ đơn kế thừa ▪ → Đưa thêm khái niệm Giao diện (Interface) A E D F 35 Đơn kế thừa & Đa kế. .. cho lớp Square kế thừa cả HAI lớp cha thừa kế? + fill() Shape + move() Square Circle Triangle 34 Đơn kế thừa & Đa kế thừa ❖ Đa kế thừa (Multiple Inheritance) ▪ Một lớp kế thừa nhiều lớp cha... tiêu ❖ Trình bày nguyên lý định nghĩa lại kế thừa ❖ Phân biệt khái niệm đơn kế thừa đa kế thừa ❖ Giới thiệu giao diện, lớp trừu tượng vai trò chúng ❖ Ví dụ tập vấn đề với ngơn ngữ lập trình Java

Ngày đăng: 26/01/2023, 17:43

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN