NỘI DUNG BÀI VIẾT
Mục tiêu
Luyện tập thiết kế và triển khai mô hình lớp đối tượng sử dụng lớp trừu tượng và interface.
Điều kiện
Biết cách sử dụng lớp trừu tượng và interface.
Mô tả
Để dễ dàng gọi (sử dụng) phương thức makeSound()
của các đối tượng mô phỏng động, tạo lớp trừu tượng Animal
.
Triển khai lớp Chicken
và Tiger
là lớp con của lớp Animal
.
Để dễ dàng gọi (sử dụng) phương thức howToEat()
của các đối tượng “ăn được”, tạo interface Edible
. Cho lớp Chicken
triển khai interface Edible
.
Tạo lớp trừu tượng Fruit
để mô phỏng các đối tượng “trái cây”, cũng là một Edible
. Triển khai các lớp con Orange
và Apple
.
Giản đồ UML được thể hiện như sau:
Hướng dẫn:
Bước 1: Xây dựng lớp Animal
, Tiger
, và Chicken
Mã kiểm thử
Ta viết một chương trình nhỏ để kiểm thử các lớp trên
import animal.Animal; import animal.Chicken; import animal.Tiger; public class AbstractAndInterfaceTests { public static void main(String[] args) { Animal[] animals = new Animal[2]; animals[0] = new Tiger(); animals[1] = new Chicken(); for (Animal animal : animals) { animal.makeSound(); } } }
Lớp Animal
:
package animal; public abstract class Animal { public abstract String makeSound(); }
Lớp Tiger
:
package animal; public class Tiger extends Animal { @Override public String makeSound() { return "Tiger: roarrrrr!"; } }
Lớp Chicken
:
package animal; public class Chicken extends Animal { @Override public String makeSound() { return "Chicken: cluck-cluck!"; } }
Chạy chương trình kiểm thử và theo dõi kết quả
Bước 2: Xây dựng Interface Edible
:
Mã kiểm thử
Thay đổi chương trình kiểm thử để kiểm tra interface Edible
và sự implement của lớp Chicken
:
import animal.Animal; import animal.Chicken; import animal.Tiger; import edible.Edible; public class AbstractAndInterfaceTests { public static void main(String[] args) { Animal[] animals = new Animal[2]; animals[0] = new Tiger(); animals[1] = new Chicken(); for (Animal animal : animals) { System.out.println(animal.makeSound()); if (animal instanceof Chicken) { Edible edibler = (Chicken) animal; System.out.println(edibler.howToEat()); } } } }
Interface Edible
:
package edible; public interface Edible { String howToEat(); }
Implement Edible
:
package animal; import edible.Edible; public class Chicken extends Animal implements Edible { @Override public String makeSound() { return "Chicken: cluck-cluck!"; } @Override public String howToEat() { return "could be fried"; } }
Chạy thử chương trình kiểm thử và theo dõi kết quả.
Bước 3: Xây dựng lớp Fruit
, Apple
và Orange
.
Mã kiểm thử
Bổ sung hai khối mã sau vào phần mã kiểm thử:
import fruit.Fruit; import fruit.Orange; import fruit.Apple;
Fruit fruits = new Fruit[2]; fruits[0] = new Orange(); fruits[1] = new Apple(); for (Fruit fruit : fruits) { System.out.println(fruit.howToEat()); }
Lớp Fruit
package fruit; import edible.Edible; public abstract class Fruit implements Edible { }
Lớp Apple
package fruit; public class Apple extends Fruit { @Override public String howToEat() { return "Apple could be slided"; } }
Lớp Orange
package fruit; public class Orange extends Fruit { @Override public String howToEat() { return "Orange could be juiced"; } }
Chạy chương trình kiểm thử và theo dõi kết quả.
Hướng dẫn nộp bài:
Up bài lên github
Paste link github vào phần nộp bài.
Mã nguồn của bài thực hành này có thể được tham khảo tại đây.