Bài giảng Lớp trừu tượng

Giải thích được lớp trừu tượng là gì.  Hiện thực được lớp trừu tượng, hành vi trừu tượng bằngJava.  Giải thích đặc điểm của lớp trừu tượng.  Giải thích được interface là gì.  Khai báo được interfece.  Hiện thực được interface trong lớp.  Giải thích được tính thừa kế của interface.  Định nghĩa đối tượng bằng interface.  Giải thích được package của Java là gì.  Tạo được package.  Sử dụng được lớp trong package.

pdf10 trang | Chia sẻ: haohao89 | Lượt xem: 2349 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Bài giảng Lớp trừu tượng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
1LỚP TRỪU TƯỢNG (Abstract Class) 2 Ôn tập  Thừa kế: Kỹ thuật cho phép tái sử dụng data và code Lớp con thừa hưởng các đặc điểm của lớp cha.  Trong Java, chỉ định thừa kế bằng từ khóa extends ( lớp con là mở rộng) của lớp cha.  Overloading method: Kỹ thuật cho phép trong một lớp có các hành vi trùng tên nhưng khác chữ ký.  Overriding method: Kỹ thuật cho phép viết lại code của hành vi mà lớp con thừa kế tư lớp cha để tạo ra sự khac biệt.  Đa hình trong OOP có được là nhờ kỹ thuật Overriding.  Khi ép kiểu (type casying) lớn sang kiểu nhỏ có thể bị tràn trị.  Kiểm tra một đối tượng có thuộc về một lớp hay không bằng toán tử instanceof.  Tham số trong hàm Java là tham số trị. 3 Mục tiêu  Giải thích được lớp trừu tượng là gì.  Hiện thực được lớp trừu tượng, hành vi trừu tượng bằng Java.  Giải thích đặc điểm của lớp trừu tượng.  Giải thích được interface là gì.  Khai báo được interfece.  Hiện thực được interface trong lớp.  Giải thích được tính thừa kế của interface.  Định nghĩa đối tượng bằng interface.  Giải thích được package của Java là gì.  Tạo được package.  Sử dụng được lớp trong package. 4 Nội dung  Lớp trừu tượng là gì?  Hiện thực lớp trừu tượng và hành vi trừu tượng.  Đặc điểm của lớp trừu tượng.  Interface là gì?  Khai báo interface  Hiện thực interface trong một lớp  Interface thừa kế  Định nghĩa trực tiếp đối tượng bằng interface  Package là gì?  Tạo package.  Sử dụng package. 5 Lớp trừu tượng là gì?  Xem kết qủa của việc khái quát hóa sau: class ANIMAL void Travel(); class Bird void Travel() class Fish void Travel() class Snake void Travel() Bạn có hình dung nổi một ANIMAL di chuyển như thế nào không? Bạn có hình dung nổi một đối tượng thuộc các lớp này di chuyển như thế nào không? Không Trừu tượng Có cụ thể 6 Lớp trừu tượng- Abstract class  Là kết qủa của việc khái quát hóa qúa cao đến nỗi không biết viết code thế nào.  Là lớp có những hành vi chỉ khai báo mà không viết code. Để dành code cụ thể sẽ được hiện thực ở các lớp dẫn xuất ( lớp cụ thể hơn).  Tư duy tự nhiên:  Từ các đối tượng cụ thể Lớp cụ thể.  Từ các lớp cụ thể có cùng tính chất lớp trừu tượng. 7Hinh PI Tên + DienTich() Hinh_CN - cdai - crong + DienTich() HinhTron - bankinh + DienTich() HinhVuong - canh + DienTich() Hinh_TGiac - diem1 - diem2 - diem3 + DienTich() 8 Lớp trừu tượng (abstract)  Lớp trừu tượng chỉ được dùng làm lớp cha cho các lớp khác, nó không có các thể hiện (instance).  Lớp trừu tượng định nghĩa các thuộc tính chung cho các lớp con của nó.  Ví dụ có thể thiết kế lớp Hình tròn, Hình vuông... kế thừa từ lớp trừu tượng Hình. Lớp Hình có thuộc tính là tên hình, các phương thức tính diện tích, chu vi... 9 Bài tập - Lớp trừu tượng  Mô tả các lớp cho hình tròn, hình chữ nhật, hình vuông, hình tam giác.  Dùng kỹ thuật phân tích phân cấp thừa kế, khái quát hóa các lớp này để sinh ra một lớp trừu tượng có hành vi tính diện tích và tình chu vi. Viết code – thực hành: Cài đặt các lớp này. Viết chương trình khai báo biến và hành vi thuộc lớp trừu tượng. Xuất diện tích của các hình khác nhau. Diện tích hình vuông: canh*canh Diện tích HCN: (dai*rong) Diện tích hình tròn: PI*R*R Diện tích hình tam giác khi biết tọa độ 3 điểm (x1, y1), (x2, y2), (x3, y3): x21=x2 - x1; y21=y2 - y1; x31=x3 - x1; y31=y3 - y1; Diện tích = | y21*x31-x21*y31 | /2; Hinh PI Tên + DienTich() Hi h_CN - cdai - crong + DienTich() HinhTron - bankinh + DienTich() HinhVuong - canh + DienTich() Hinh_TGiac - diem1 - diem2 - diem3 + DienTich() 10 Lớp trừu tượng.  Tư duy theo lối chuyên gia: Khai báo lớp trừu tượng trước ( hoặc tập các hành vi mà ta gọi là inteface – học sau) để các lớp cụ thể hiện thực các hành vi này sau.  Lớp cha là lớp trừu tượng, lớp con chưa hiện thực đủ các hành vi trừu tượng được kế thừa từ lớp cha thì lớp con này vẫn là lớp trừu tượng.  Sử dụng từ khóa abstract để khai báo một lớp trừu tượng hoặc 1 hành vi trừu tượng 11 Lớp trừu tượng  Lớp trừu tượng (abstract) thường có ít nhất một phương thức trừu tượng, là phương thức không có cài đặt. public abstract void draw();  Khai báo lớp trừu tượng public abstract class ClassName {…}  Các lớp con của một lớp cha trừu tượng phải cài đặt tất cả các phương thức trừu tượng. Nếu không nó cũng sẽ trở thành lớp trừu tượng.  Không thể tạo các đối tượng của một lớp trừu tượng nhưng có thể khai báo biến thuộc kiểu lớp trừu tượng để tham chiếu đến các đối tượng thuộc lớp con của nó. 12 Hiện thực lớp trừu tượng  Cú pháp khai báo lớp trừu tượng abstract class ClassName { abstract [modifier] Type MethodName (Args); } Kết hợp cho phép abstract public abstract protected Kết hợp KHÔNG cho phép abstract private abstract static abstract final 13 Lớp trừu tượng public abstract class Hinh { static final double PI = 3.14159; public abstract double getArea(); public abstract double getVolume(); } class HinhTron extends Hinh { double radius; public double getArea() { return PI*radius*radius; } public double getVolume() { return 0; } } class HinhLapPhuong extends Hinh { double a, b, c; public double getArea() { return 2*(a*b+b*c+c*a); } public double getVolume() { return a*b*c; } } 14 Hiện thực lớp trừu tượng Có hành vi abstract mà lớp không có chỉ thị abstract Hành vi không có chỉ thị abstract thì phải có code 15 Ví dụ - Abstract class Chưa thể viết code vì lương 1 người = lương cơ bản * hệ số 16 Đặc điểm của lớp trừu tượng.  Không thể khởi tạo một đối tượng thuộc lớp trừu tượng (abstract) mà chỉ khởi tạo đối tượng thuộc lớp cụ thể (concrete). 17 Đặc điểm của lớp trừu tượng.  Tham chiếu lớp cha chỉ đến lớp con kể cả lớp cha là lớp trừu tượng hay lớp cụ thể tính đa hình trong OOP 18 Biến lớp ông chỉ đến đối tượng lớp cháu  Một lớp con cũng có thể là lớp trừu tượng và biến tham chiếu của lớp ông cha có thể chỉ đến đối tượng lớp con cháu tính đa hình trong OOP Đặc điểm của lớp trừu tượng. 19 Sự kết hợp giữa abstract với các chỉ thị khác 20 Interface là gì?  Theo phương pháp phân cấp thừa kế, có thể lớp cha có những hành vi chưa biết viết code thề nào hành vi trừu tượng lớp trừu tượng.  Ta muốn một lớp được thừa kế từ nhiều lớp trừu tượng mà không bị khống chế bởi tính đơn thừa kế.  Giải pháp: Interface 21 Interface là gì?  Một interface là một tập những phương thức trừu tượng (abstract methods) và những hằng số trừu tượng  Interface mang ý nghĩa “như là một lớp hoàn toàn trừu tượng” hay Interface được xem như là một lớp hoàn toàn trừu tượng.  Một interface được sử dụng để định nghĩa một tập những phương thức mà một class sẽ thực hiện  Interface là một đặc điểm của các ngôn ngữ OOP mới như Java, C#.  Interface là một công cụ để hiện thực dạng đa thừa kế trong Java, C#. 22 Khai báo interface  Khai báo interface bằng 1 file.java, biên dịch thành file.class. public hoặc bỏ qua public: Mọi nơi đều có thể truy xuất Không có modifier: (default) Chỉ trong cùng gói mới có thể truy xuất Một public interface đòi hỏi: Tên file chứa khai báo interface phải cùng tên với tên interface Từ khóa  Cú pháp: [Modifier] interface InterfaceName { return_type Method1( param_list); Datatype final_var1 = Value1; // khai báo hằng return_type Method2( param_list); // prototype Datatype final_var2 = Value2; …. } 23 Ví dụ public interface Hinh { public static final double PI=3.1415; public abstract double DienTich(); double ChuVi(); } Từ khóa Dấu ; được theo sau mỗi phương thức 24 Interfaces  Một interface không thể được thể hiện  Những phương thức trong một interface có bổ từ truy xuất public  Một lớp implement (thực thi) một interface bằng cách:  Định nghĩa tên interface trong class header  Cung cấp những thực thi cụ thể cho mỗi phương thức trừu tượng trong interface  Nếu một class thực thi một interface, nó phải định nghĩa tất cả các phương thức trong interface, nếu không trình biên dịch sẽ báo lỗi. 25 Thực thi Interface  Một class có thể thực thi nhiều interface Mỗi một interface được phân biệt bởi dấu phẩy (,)  Lớp phải thực thi tất cả các phương thức trong tất cả các interfaces được liệt kê trong class header  Một lớp thực thi một interface cũng có thể thực thi các phương thức khác của nó.  Để khai báo một lớp thực thi interfaces, sử dụng từ khóa implements : class ClassName implements interface1, interface2 { // all methods of both interfaces } 26 Cú pháp xây dựng lớp có hiện thực interface [modifier] class Tên extends LớpCha implements Interface1, interface2,... { } Thứ tự không quan trọng 27 Ví dụ class HinhVuong implements Hinh{ protected double edge; public HinhVuong (double e){ edge=e; } public double DienTich() { return(edge*edge); } public double ChuVi() { return(edge*4); } } 28 Ví dụ interface Drawable { public void draw(); } public abstract class Hinh{...} public class HinhTron extends Hinh implements Drawable { ... public void draw() {...} } 29 Thực thi Interface Lớp trừu tượng có thể chưa cụ thể các method của interface Modifier của hành vi cụ thể của các method trong interface phải là public  Lớp trừu tượng có thể chưa cụ thể các method của interface.  Modifier của hành vi cụ thể của các method trong interface phải là public 30 Khai báo biến thông qua interface Biến interface chỉ được dùng với các hành vi có trong interface Ví dụ: Biến interface 31 Ví dụ: Biến interface Sửa lại chương trình 32 Bài tập – về nhà  Tương tự với hình vuông, bạn tự làm với Ellipse, tam giác, hình chữ nhật, hình tròn.  Chu vi ellipse: pi(Rx + Ry)  diện tích ellipse: pi*Rx*Ry 33 Interface thừa kế  Interface có thể thừa kế interface cha  Interface con là hội lại các khai báo hành vi.  Cú pháp: interface InterfaceSon extends InterfaceFather { }  Nếu một lớp implements interface con thì phải cụ thể hóa cả các method có trong interface cha. 34 Ví dụ 35 Định nghĩa trực tiếp đối tượng bằng interface  Có thể định nghĩa trực tiếp một đối tượng bằng interface hoặc lớp trừu tượng với điều kiện có cụ thể hóa các hành vi.  Đối tượng được định nghĩa trực tiếp gọi là đối tượng thuộc lớp vô danh (anonymous class). Nghĩa là, không có tên lớp, chỉ định nghĩa một đối tượng thuộc interface hoặc lớp trừu tượng rồi hiện thực các hành vi. 36 Cụ thể hóa hành vi Cụ thể hóa các hành vi Xem kỹ cú pháp Ví dụ 37 Đối tượng interface và lớp trừu tượng dang dở Không có đoạn này khi compile sẽ báo lỗi 38 Lớp “giả” trừu tượng  Một thể hiện của 1 interface phải hiện thực đầy đủ các hành vi đã khai báo trong interface này.  Tình huống: Ta muốn có một thể hiện của 1 interface nhưng chỉ muốn hiện thực một vài methods của interface này thì sao?  Giải pháp: Lớp “giả” trừu tượng, lớp abstract nhưng có code “thật”. interface abstract class implements các methods của interface bằng code trống Tạo động một đối tượng thuộc lớp trừu tượng (anonymous class), chỉ override methods được cần đến. Đây là kỹ thuật mà Java sử dụng để tạo các lớp gọi là Adapter giúp cho người lập trình bớt phải viết code các methods trong interface 39 Thí dụ Lớp abstract nhưng có code thật là code rỗng 40 Interface Comparable  Thư viện lớp chuẩn của java chứa nhiều interfaces giúp thực hiện trong một vài trường hợp  Interface Comparable chứa một phương thức trừu tượng gọi là compareTo, phương thức này được sử dụng để so sánh 2 đối tượng  Class String thực hiện Comparable cho chúng ta khả năng sắp xếp những chuỗi trong thứ tự alphabe  Bất kỳ lớp nào cũng có thể implement interface Comparable để cung cấp một kỹ thuật cho việc so sánh các đối tượng. if (obj1.compareTo(obj2) < 0) System.out.println ("obj1 is less than obj2"); • Giá trị trả về từ phương thức compareTo là số âm nếu obj1 nhỏ hơn obj2, 0 nếu chúng bằng nhau, và số dương nếu obj1 lớn hơn obj2 41 Interface vs. Abstract class  Trong interface, dữ liệu phải là hằng, abstract class có thể có cả dữ liệu biến.  Trong interface, phương thức chỉ có header mà ko có thực hiện, abstract class có thể có phương thức đầy đủ.  Trong interface, tất cả dữ liệu là public final static và phương thức là public abstract public interface T1{ public static final int k=1; public abstract void p(); } public interface T1{ int k=1; void p(); } 42 Interface vs. Abstract class  Có thể truy nhập các hằng trong interface sử dụng cú pháp InterfaceName.CONSTANT_NAME.  Có thể sử dụng interface để thực hiện đa thừa kế với class và các subinterface. public class NewClass extends BaseClass implements Interface1, …, InterfaceN { … } public interface NewInterface extends Interface1, …, InterfaceN { // các hằng và phương thức trừu tượng } 43 Package là gì? Bài toán class C1 class C2 class C3 ....... class Cn Quản lý thế nào? Phân nhóm theo chức năng Nhóm 1 class C1 class C2 class C3 Nhóm 2 class C4 class C5 class C6 Nhóm 2_1 class C7 class C8 Nhóm 2_2 class C9 class C10 Nhóm ... class C11 .... class Cn Mỗi nhóm để trong một thư mục  Package Phân tích, quản lý project 44  Package: gói phần mềm.  Là một nhóm các class, interface, các gói khác đã được biên dịch thành Java bytecode.  Tổ chức của 1 package là 1 thư mục có tên là tên của package Sub-package là 1 gói con (thư mục con) của 1 package mức cao hơn (giống cấu trúc thư mục).  Gói là công cụ tạo khả năng tái sử dụng mã (reusable code). Package là gì? 45 Tạo package  Khai báo package trong code của class.  Tên file phải là tên lớp, mỗi lớp để trong 1 file riêng biệt  Dùng từ khóa package  Cú pháp: package PackageCha[.PackageCon];  Phải là dòng đầu tiên của code java. /* Comment */ package PackageCha[.PackageCon]; [import OtherPackageName ;] class ClassName { ....... } Khi biên dịch thành công: -Nếu chưa có thư mục PackageName thì thư mục này sẽ được tự động tạo ra -file.class của code này sẽ được đặt vào thư mục này. 46 Ví dụ Tạo gói MyPackage có cấu trúc: 47 package MyPackage; // file BtCh3/Calculate.java public class Calculate { public static double Volume(double l, double w, double h) {return l*w*h;} public static double Add(double n1, double n2) { return n1+n2;} } Sau khi biên dịch, cấu trúc gói theo yêu cầu sẽ được tự động sinh ra. Ví dụ 48 package MyPackage.Shape; // BtCh3/Circle.java public class Circle { double r; public Circle(double rr) { r=rr;} public double Circumference() { return 2*Math.PI*r;}// chu vi public double Area() { return Math.PI* r*r; } } Ví dụ 49 Sử dụng Package  Dùng chỉ thị import với một trong các cú pháp sau: import PackageName.*; import PackageCha.PackageCon.*; import PackageName.ClassName; import PackagCha.PackageCon.ClassName; 50 Ví dụ import java.io.*; import MyPackage. import MyPackage.Shape.Circle; class TestMyPackage { public static void main(String args[]) { System.out.println(Calculate.Volume(3,4,5)); Circle C= new Circle(5); System.out.println(C.Area()); } } 60.0 78.53981633974483 51 Ví dụ  Tạo các package với cấu trúc: 52 Ví dụ 53 Ví dụ 54 Ví dụ 55 Tham khảo gói java.util để biết về các lớp java làm sẵn để quản lý các loại danh sách Ví dụ 56 import hai lớp Ví dụ 57 Bài tập Bạn viết thêm:  Lớp FacultyList để quản lý danh sách giáo viên đưa vào gói Faculty.  Lớp FacultyListDemo để minh họa việc quản lý danh sách giáo viên. 58 THANK YOU