Bài giảng Lập trình hướng đối tượng: Chương 6 Một số kỹ thuật trong kế thừa với mục tiêu giúp các bạn trình bày nguyên lý định nghĩa lại trong kế thừa; Đơn kế thừa và đa kế thừa; Giao diện và lớp trừu tượng; Sử dụng các vấn đề trên với ngôn ngữ lập trình Java.
9/18/17 Mục tiêu học n Bộ môn Công nghệ Phần mềm Viện CNTT & TT Trường Đại học Bách Khoa Hà Nội n n LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài 06 Một số kỹ thuật kế thừa n Trình bày nguyên lý định nghĩa lại kế thừa Đơn kế thừa đa kế thừa Giao diện lớp trừu tượng Sử dụng vấn đề với ngơn ngữ lập trình Java Nội dung Nội dung Định nghĩa lại (Redefine/Overriding) Lớp trừu tượng (Abstract class) Đơn kế thừa đa kế thừa Giao diện (Interface) Định nghĩa lại (Redefine/Override) Lớp trừu tượng (Abstract class) Đơn kế thừa đa kế thừa Giao diện (Interface) 9/18/17 Định nghĩa lại hay ghi đè n Định nghĩa lại hay ghi đè (2) Lớp định nghĩa phương thức trùng tên với phương thức lớp cha: n n 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 đè (Method Redefine/Override) n n 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 class Shape { protected String name; Shape(String n) { name = n; } public String getName() { return name; } public float calculateArea() { return 0.0f; } } class Circle extends Shape { private int radius; Circle(String n, int r){ super(n); radius = r; } class Square extends Shape { private int side; Square(String n, int s) { super(n); side = s; } public float calculateArea() { float area = (float) side * side; return area; } } public float calculateArea() { float area = (float) (3.14 * radius * radius); return area; } } 9/18/17 this super Thêm lớp Triangle class Triangle extends Shape { private int base, height; Triangle(String n, int b, int h) { super(n); base = b; height = h; } public float calculateArea() { float area = 0.5f * base * height; return area; } } n this super sử dụng cho phương thức/thuộc tính non-static phương thức khởi tạo n n n this: tìm kiếm phương thức/thuộc tính lớp super: tìm kiếm phương thức/thuộc tính lớp cha trực tiếp Từ khóa super cho phép tái sử dụng đoạn mã lớp cha lớp package abc; public class Person { protected String name; protected int age; public String getDetail() { String s = name + "," + age; return s; } } import abc.Person; public class Employee extends Person { double salary; public String getDetail() { String s = super.getDetail() + "," + salary; return s; } 11 } 10 Bài tập: Sửa lại cho kết true class Value { int i; } public class EqualsMethod2 { public static void main(String[] args) { Value v1 = new Value(); Value v2 = new Value(); v1.i = v2.i = 100; System.out.println(v1.equals(v2)); } } 12 9/18/17 Solution Định nghĩa lại hay ghi đè (3) class Value { int i; public boolean equals(Object obj){ if (obj instanceof Value) return ((Value)obj).i == this.i; return false; } } n Một số quy định n Phương thức ghi đè lớp phải n n n Không phép ghi đè: n n n 13 Các định truy cập không giới hạn chặt phương thức lớp cha n (Các phương thức private lớp cha, lớp không kế thừa được) 14 class Parent { public void doSomething() {} protected int doSomething2() { return 0; cannot override: attempting to use } incompatible return type } class Child extends Parent { protected void doSomething() {} protected void doSomething2() {} } Một số quy định (tiếp) n Các phương thức (final) lớp cha Các phương thức static lớp cha Ví dụ Định nghĩa lại hay ghi đè (3) n Có danh sách tham số giống hệt phương thức kế thừa lớp cha Có kiểu trả với phương thức kế thừa lớp cha Ví dụ, ghi đè phương thức protected, phương thức protected public, mà không private cannot override: attempting to assign weaker access privileges; was public 15 16 9/18/17 Ví dụ Bài tập NhanVien #tenNhanVien:String class Parent { public void doSomething() {} private int doSomething2() { return 0; } } class Child extends Parent { public void doSomething() {} private void doSomething2() {} } #heSoLuong:double #luongCoBan: double n n n n Nội dung +LUONG_MAX:double=20.000.000 thuộc tính không +tangLuong(double):boolean NhanVien kế thừa lại cho lớp +tinhLuong():double +inTTin() TruongPhong Viết mã nguồn lớp TruongPhong hình vẽ n 17 Sửa lại lớp NhanVien: 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 TruongPhong -phuCap:double -soNamDuongChuc:double +tinhLuong():double +inTTin() 18 Lớp trừu tượng (Abstract Class) Định nghĩa lại (Redefine/Overiding) Lớp trừu tượng (Abstract class) Đơn kế thừa đa kế thừa Giao diện (Interface) n n 19 Khơng thể thể hóa (instantiate – tạo đối tượng lớp) trực tiếp Chưa đầy đủ, thường sử dụng làm lớp cha Lớp kế thừa hồn thiện nốt 20 9/18/17 Lớp trừu tượng (2) n Để trở thành lớp trừu tượng, cần: n n Khai báo với từ khóa abstract Có thể chứa phương thức trừu tượng (abstract method - có chữ ký mà khơng có cài đặt cụ thể) n n n public abstract float calculateArea(); Lớp kế thừa phải cài đặt cụ thể cho phương thức trừu tượng lớp cha Phương thức trừu tượng khai báo final static Nếu lớp có hay nhiều phương thức trừu tượng phải lớp trừu tượng public float calculateArea() { float area = (float) (3.14 * radius * radius); return area; } } 21 Ví dụ lớp trừu tượng Lớp bắt buộc phải override tất phương thức abstract lớp chả 22 Ví dụ lớp trừu tượng (2) import java.awt.Graphics; abstract class Action { protected int x, y; public void moveTo(Graphics g, int x1, int y1) { erase(g); x = x1; y = y1; draw(g); } } abstract class Shape { protected String name; Shape(String n) { name = n; } public String getName() { return name; } public abstract float calculateArea(); } class Circle extends Shape { private int radius; Circle(String n, int r){ super(n); radius = r; } abstract public void erase(Graphics g); abstract public void draw(Graphics g); 23 class Circle extends Action { int radius; public Circle(int x, int y, int r) { super(x, y); radius = r; } public void draw(Graphics g) { System out println("Draw circle at (" + x + "," + y + ")"); g.drawOval(x-radius, y-radius, 2*radius, 2*radius); } public void erase(Graphics g) { System.out.println("Erase circle at (" + x + "," + y + ")"); // paint the circle with background color } } 24 9/18/17 Nội dung Đa kế thừa đơn kế thừa Định nghĩa lại (Redefine/Overiding) Lớp trừu tượng (Abstract class) Đơn kế thừa đa kế thừa Giao diện (Interface) n Đa kế thừa (Multiple Inheritance) n n n Một lớp kế thừa nhiều lớp khác C++ hỗ trợ đa kế thừa A n n Một lớp kế thừa từ lớp khác D Java hỗ trợ đơn kế thừa Đưa thêm khái niệm Giao diện (Interface) A 25 SomeClass FlyingThing + color + getColor () + color + getColor () Bird Animal FlyingThing + color + getColor () + color + getColor () F 26 Nội dung Animal E D Vấn đề gặp phải Đa kế thừa Repeated inheritance C Đơn kế thừa (Single Inheritance) n Name clashes on attributes or operations B Định nghĩa lại (Redefine/Overiding) Lớp trừu tượng (Abstract class) Đơn kế thừa đa kế thừa Giao diện (Interface) Bird Resolution of these problems is implementation-dependent 28 9/18/17 Action Shape Giao diện-Interface #x: int #y: int +draw(Graphics) #name: String +getName():String +calculateArea():float +moveTo(Graphics,int, int) +erase(Graphics) n Circle -radius: float +calculateArea():float +draw(Graphics) +erase(Graphics) n Shape Actable #name: String #x:int #y:int n +draw(Graphics) +getName():String +calculateArea():float +moveTo(Graphics,int, int) +erase(Graphics) Interface: đặc tả cho cài đặt (implementation) khác Interface định nghĩa "kiểu" chứa định nghĩa phương thức trừu tượng Interface không cài đặt phương thức để lại cấu trúc thiết kế lớp sử dụng Circle -radius:float +calculateArea():float +draw(Graphics) +moveTo(Graphics,int,int) +erase(Graphics) 29 30 Giao diện • • Giao diện (2) Cho phép lớp kế thừa (thực thi implement) nhiều giao diện lúc Khơng thể thể hóa (instantiate) trực tiếp n Để trở thành giao diện, cần n n Sử dụng từ khóa interface để định nghĩa Chỉ bao gồm: n n n Lớp thực thi giao diện n n 31 Chữ ký phương thức (method signature) Các thuộc tính khai báo (static & final) Hoặc lớp trừu tượng (abstract class) Hoặc bắt buộc phải cài đặt chi tiết toàn phương thức giao diện lớp instance 32 9/18/17 Giao diện (3) n Cú pháp thực thi Java: n n n Ví dụ [extends ] implements extends Shape Actable #name: String #x:int #y:int +draw(Graphics) +getName():String +calculateArea():float Ví dụ: public interface DoiXung {…} public interface DiChuyen {…} public class HinhVuong extends TuGiac implements DoiXung, DiChuyen { } +moveTo(Graphics,int, int) +erase(Graphics) Circle -radius:float +calculateArea():float +draw(Graphics) +moveTo(Graphics,int,int) +erase(Graphics) 33 import java.awt.Graphics; abstract class Shape { protected String name; protected int x, y; Shape(String n, int x, int y) { name = n; this.x = x; this.y = y; } public String getName() { return name; } public abstract float calculateArea(); } interface Actable { public void draw(Graphics g); public void moveTo(Graphics g, int x1, int y1); public void erase(Graphics g); } 35 34 class Circle extends Shape implements Actable { private int radius; public Circle(String n, int x, int y, int r){ super(n, x, y); radius = r; } public float calculateArea() { float area = (float) (3.14 * radius * radius); return area; } public void draw(Graphics g) { System out println("Draw circle at (" + x + “," + y + ")"); g.drawOval(x-radius,y-radius,2*radius,2*radius); } public void moveTo(Graphics g, int x1, int y1){ erase(g); x = x1; y = y1; draw(g); } public void erase(Graphics g) { System out println(“Erase circle at (" + x + “," + y + ")"); // paint the region with background color } } 36 9/18/17 Nhược điểm Giao diện để giải vấn đề Đa kế thừa Lớp trừu trượng vs Giao diện Lớp trừu trượng n Có thể có phương thức abstract, chứa phương thức instance n Có thể chứa phương thức protected static n Có thể chứa thuộc tính final non-final n Một lớp kế thừa lớp trừu tượng n Giao diện n Chỉ chứa chữ ký phương thức (danh sách phương thức) n Chỉ chứa phương thức public mà khơng có mã nguồn n Chỉ chứa thuộc tính n Một lớp thực thi (kế thừa) nhiều giao diện n 37 Không cung cấp cách tự nhiên cho tình khơng có đụng độ kế thừa xảy Kế thừa để Tái sử dụng mã nguồn Giao diện không làm điều 38 10 ... private cannot override: attempting to assign weaker access privileges; was public 15 16 9/18/17 Ví dụ Bài tập NhanVien #tenNhanVien:String class Parent { public void doSomething() {} private... thuộc tính lớp TruongPhong Lương trưởng phịng = Lương Cơ * hệ số lương + phụ cấp TruongPhong -phuCap:double -soNamDuongChuc:double +tinhLuong():double +inTTin() 18 Lớp trừu tượng (Abstract Class)... thể thể hóa (instantiate – tạo đối tượng lớp) trực tiếp Chưa đầy đủ, thường sử dụng làm lớp cha Lớp kế thừa hồn thiện nốt 20 9/18/17 Lớp trừu tượng (2) n Để trở thành lớp trừu tượng, cần: n n