Bài giảng Lập trình hướng đối tượng: Kế thừa - Nguyễn Việt Hà

pdf 30 trang phuongnguyen 5050
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng: Kế thừa - Nguyễn Việt Hà", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_ke_thua_nguyen_viet_ha.pdf

Nội dung text: Bài giảng Lập trình hướng đối tượng: Kế thừa - Nguyễn Việt Hà

  1. Kế thừa
  2. Nội dung „ Vấn đề sử dụng lại „ Sử dụng lại bằng kế thừa „ Kế thừa trong Java định nghĩa lớp kế thừa thêm phương thức, thuộc tính kiểm soát truy cập constructor „ Lớp Object NguyễnViệtHà Kế thừa 2
  3. Tài liệu tham khảo „ Thinking in Java, chapter 6 „ Java how to program, chapter 9 NguyễnViệtHà Kế thừa 3
  4. Sử dụng lại „ Tồntại nhiềuloại đốitượng có các thuộc tính và hành vi tương tự hoặc liên quan đến nhau Person, Student, Manager, „ Xuấthiện nhu cầusử dụng lạicácmã nguồn đãviết Sử dụng lại thông qua copy Sử dụng lại thông qua quan hệ has_a Sử dụng lại thông qua cơ chế “kế thừa” NguyễnViệtHà Kế thừa 4
  5. Sử dụng lại „ Copy mã nguồn Tốn công, dễ nhầm Khó sửalỗi do tồntại nhiều phiên bản „ Quan hệ has_a Sử dụng lớpcũ như là thành phầncủalớp mới Sử dụng lạicàiđặtvớigiaodiệnmới „ Phảiviếtlạigiaodiện „ Chưa đủ mềm dẻo NguyễnViệtHà Kế thừa 5
  6. Ví dụ: has_a class Person { private String name; private Date bithday; public String getName() { return name; } } class Employee { private Person me; private double salary; public String getName() { return me.getName(); } } NguyễnViệtHà Kế thừa 6
  7. class Manager { private Employee me; private Employee assistant; public setAssistant(Employee e) { } } Manager junior = new Manager(); Manager senior = new Manager(); senior.setAssistant(junior); // error NguyễnViệtHà Kế thừa 7
  8. Kế thừa „ Dựa trên quan hệ is_a „ Thừahưởng lạicácthuộctínhvàphương thức đãcó „ Chi tiết hóa cho phù hợpvớimục đích sử dụng mới Thêm các thuộc tính mới Thêm hoặchiệuchỉnh các phương thức NguyễnViệtHà Kế thừa 8
  9. Thuậtngữ „ Kế thừa „ Lớpcơ sở, lớp cha „ Lớpdẫnxuất, lớp con NguyễnViệtHà Kế thừa 9
  10. Kế thừa trong Java [public] class DerivedClass extends BaseClass { /* new features goes here */ } Ví dụ: class Employee extends Person { private double salary; public boolean setSalary(double sal) { salary = sal; return true; } } NguyễnViệtHà Kế thừa 10
  11. Person Employee e = new Employee(); -name -birthday e.setName("John"); +setName() e.setSalary(3.0); +setBirthday() Employee -salary +setSalary() +getDetail() NguyễnViệtHà Kế thừa 11
  12. private members class Employee extends Person { public String getDetail() { String s; // s = name + "," + birthday; s = getName() + "," + getBirthday(); s += "," + salary; return s; } } NguyễnViệtHà Kế thừa 12
  13. Mứctruycậpprotected „ Để đảmbảochedấu thông tin, thông thường các thuộctínhđược khai báo là private Đối tượng thuộc lớpdẫnxuấtphảitruycậptới chúng thông qua các phương thức get và set. „ Mứctruycập protected giải quyếtvấn đề này Đốitượng củalớpdẫnxuấttruycập được các protected members của lớpcơ sở Các đốitượng khác không truy cập được NguyễnViệtHà Kế thừa 13
  14. public class Person { protected Date birthday; protected String name; } public class Employee extends Person { public String getDetail() { String s; s = name + "," + birthday; s += "," + salary; return s; } } NguyễnViệtHà Kế thừa 14
  15. Các mức kiểm soát truy cập Modifier Same Same Subclass Universe class package private Yes package Yes Yes (default) protected Yes Yes Yes public Yes Yes Yes Yes NguyễnViệtHà Kế thừa 15
  16. Trong cùng gói public class Person { Date birthday; String name; } public class Employee extends Person { public String getDetail() { String s; s = name + "," + birthday; s += "," + salary; return s; } } NguyễnViệtHà Kế thừa 16
  17. package abc; Khác gói public class Person { protected Date birthday; protected String name; } import abc.Person; public class Employee extends Person { public String getDetail() { String s; s = name + "," + birthday; s += "," + salary; return s; } } NguyễnViệtHà Kế thừa 17
  18. Định nghĩalạicácphương thức „ Chúng ta có thểđịnh nghĩalại các phương thứccủalớpcơ sở „ Đốitượng củalớpdẫnxuấtsẽ hoạt động vớiphương thứcmớiphùhợpvớinó „ Có thể tái sử dụng phương thức cùng tên củalớpcơ sở bằng từ khóa super NguyễnViệtHà Kế thừa 18
  19. package abc; public class Person { Ví dụ protected Date birthday; protected String name; public String getDetail() { } } import abc; public class Employee extends Person { public String getDetail() { String s; s = super.getDetail() + "," + salary; return s; } } NguyễnViệtHà Kế thừa 19
  20. Định nghĩa lại phương thức „ Phải có quyền truy cập không chặt hơn phương thức được định nghĩa lại „ Phải có kiểu giá trị trả lại như nhau NguyễnViệtHà Kế thừa 20
  21. class Parent { public void doSomething() {} public int doSomething2() { return 0; } } class Child extends Parent { protected void doSomething() {} public void doSomething2() {} } NguyễnViệtHà Kế thừa 21
  22. Thừakế nhiềutầng Person -name -birthday +setName +setBirthday Mọi đối tượng đều thừa kế từ lớp gốc Object Student Employee -id -salary +setSalary +getDetail Programmer Manager -project -rank NguyễnViệtHà Kế thừa 22
  23. Constructor „ Lớp dẫn xuất kế thừa mọi thuộc tính và phương thức của lớp cơ sở „ Không kế thừa phương thức khởi tạo „ Có hai giải pháp gọi constructor của lớp cơ sở sử dụng constructor mặc định gọi constructor của lớp cơ sở một cách tường minh NguyễnViệtHà Kế thừa 23
  24. class Point { protected int x, y; public Point() {} public Point(int xx, int yy) { x = xx; y = yy; } } class Circle extends Point { protected int radius; public Circle() {} } Point p = new Point(10, 10); Circle c1 = new Circle(); Circle c2 = new Circle(10, 10); // erorr NguyễnViệtHà Kế thừa 24
  25. Gọi constructor củalớpcơ sở „ Việckhởitạothuộc tính củalớpcơ sở nên giao phó cho constructor củalớpcơ sở „ Sử dụng từ khóa super để gọi constructor củalớpcơ sở Constructor củalớpcơ sở bắtbuộcphải đượcthựchiện đầutiên Nếu lớp cơ sở không có constructor mặc định thì bắt buộc phải gọi constructor tường minh NguyễnViệtHà Kế thừa 25
  26. class Point { protected int x, y; public Point() {} public Point(int xx, int yy) { x = xx; y = yy; } } class Circle extends Point { protected int radius; public Circle() {} public Circle(int xx, int yy, int r) { super(xx, yy); radius = r; } } NguyễnViệtHà Kế thừa 26
  27. class Point { protected int x, y; public Point(int xx, int yy) { x = xx; y = yy; } } class Circle extends Point { protected int radius; public Circle() { super(0, 0); } public Circle(int xx, int yy, int r) { super(xx, yy); radius = r; } } NguyễnViệtHà Kế thừa 27
  28. class Point { protected int x, y; public Point() {} public Point(int xx, int yy) { x = xx; y = yy; } } class Circle extends Point { protected int radius; public Circle() { } public Circle(int xx, int yy, int r) { // super(xx, yy); radius = r; } } NguyễnViệtHà Kế thừa 28
  29. Thứ tự khởitạo class Point { protected int x, y; public Point() { System.out.println("Point constructor"); } } class Circle extends Point { protected int radius; public Circle() { System.out.println("Circle constructor"); } } Circle c = new Circle(); NguyễnViệtHà Kế thừa 29
  30. Từ khóa final „ Thuộc tính final hằng số, chỉ được gán giá trị khởi tạo một lần, không thay đổi được giá trị „ Phương thức final không cho phép định nghĩa lại ở lớp dẫn xuất „ Tham số final không thay đổi được giá trị của tham chiếu „ Lớp final không định nghĩa được lớp dẫn xuất NguyễnViệtHà Kế thừa 30