[Thực hành] Lớp Animal và interface Edible

Abstract Class & Interface

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 AnimalTiger, 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 FruitApple 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.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Leave a Reply

Your email address will not be published. Required fields are marked *