Thắc mắc về Interface trong java

bachkhoa752

Member
7/6/13
31
1
8
27
Mình đã đọc định nghĩa về Interface( hay là tại mình chưa đọc tài liệu nào đi sâu).
Được biết Interface như là một lớp thuần ảo, một lớp không có bất cứ hàm nào được cài đặt nội dung.
Vậy mọi người phân tích 1 đoạn code sau giúp mình cái
Code:
    HttpConnection hc = (HttpConnection)Connector.open("http://congdongjava.com");
    hc.setRequestMethod(HttpConnection.GET);
    InputStream in = hc.openInputStream();
    int length = (int)hc.getLength();
    byte[] data = new byte[length];
    in.read(data);
    in.close();
    hc.close();
HttpConnection là 1 giao diện, vậy tại sao lại tạo được đối tượng hc và sử dụng các hàm "setRequestMethod(int kieu)", "getLenght()"

Rất mong được giả đáp:-/
 

SITUVN

Well-Known Member
25/2/12
967
263
63
Mình ăn nói không tốt lắm, chỉ cố gắng giải thích hết sức để bạn hiểu thôi.

PHP:
// Giao tiếp Animal
public interface Animal {
    public void setAlias();
    public String move();
    public int avgWeight();
    public int avgAge();
}

// Lớp Human
public class Human implements Animal{
    private String alias;

    public Human() {
    }

    public void setAlias(String a) {
        this.alias = a;
    }
    public String move() {
        return "Walk";
    }
    public int avgWeight() {
        return 50;
    }
    public int avgAge() {
        return 60;
    }
}

// Lớp Cat
public class Cat  implements Animal{
    private String alias;

    public Cat() {
    }

    public void setAlias(String a) {
        this.alias = a;
    }
    public String move() {
        return "Walk";
    }
    public int avgWeight() {
        return 3;
    }
    public int avgAge() {
        return 5;
    }
}

// Lớp Bird
public class Bird  implements Animal{
    private String alias;

    public Bird() {
    }

    public void setAlias(String a) {
        this.alias = a;
    }
    public String move() {
        return "Fly";
    }
    public int avgWeight() {
        return 10;
    }
    public int avgAge() {
        return 15;
    }
}

// Lớp AnimalUtil
public class AnimalUtil {
    public static int HUMAN = 1 << 0 // 1
    public static int CAT = 1 << 1 // 2
    public static int BIRD = 1 << 2 // 4
    public static Animal getAnimal(int what) {
        switch(what) {
            case: this.HUMAN;
                return new Human();
            case: this.CAT;
                return new Cat();
            case: this.BIRD;
                return new Bird();
            default: // Tham số không hợp lệ
              return null; // Hoặc quăng ngoại lệ.
        }
    }
}

// Lớp Tesing
public class Tesing {
    public static void main(String[] args) {
        try {
            Animal an = null;

            // Human
            System.out.println("Animal: Human");
            an = AnimalUtil.getAnimal(AnimalUtil.HUMAN);
            an.setAlias("I'm Human!");
            System.out.println("Move: " + an.move());
            System.out.println("Average weight: " + an.avgWeight());
            System.out.println("Average age: " + an.avgAge());

            // Cat
            System.out.println("Animal: Cat");
            an = AnimalUtil.getAnimal(AnimalUtil.CAT);
            an.setAlias("A Cat!");
            System.out.println("Move: " + an.move());
            System.out.println("Average weight: " + an.avgWeight());
            System.out.println("Average age: " + an.avgAge());

            // Bird
            System.out.println("Animal: Bird");
            an = AnimalUtil.getAnimal(AnimalUtil.BIRD);
            an.setAlias("Fly! Fly! Fly!");
            System.out.println("Move: " + an.move());
            System.out.println("Average weight: " + an.avgWeight());
            System.out.println("Average age: " + an.avgAge());
        } catch (Exception e) {
            // Phòng trường hợp có ngoại lệ
        }
    }
}
Kết quả:
Code:
Animal: Human
Move: Walk
Average weight: 50
Average age: 60
Animal: Cat
Move: Walk
Average weight: 3
Average age: 5
Animal: Bird
Move: Fly
Average weight: 10
Average age: 15
Mấy thông số phía trên không phải là chính xác đâu nhé ;))

Vai trò của các lớp và giao tiếp của mình tương đương với đoạn mã phía trên của bạn:
Animal tương ứng với HttpConnection Lớp giao tiếp
AnimalUtil tương ứng với Connector Lớp dùng để tạo ra thực thể của lớp giao tiếp, tức là lớp con của lớp giao tiếp trên.
getAnimal(int) tương ứng với open(String) Phương thức để tạo ra thực thể của lớp gia tiếp
setAlias(String) tương ứng với setRequestMethod(int)

Thực ra open(String) trả về một đối tượng (thực thể) con của lớp HttpConnection, chính vì thế mà lớp này có thể dùng phương thức đó, vì lớp con của nó đã cài lại phương thức setRequestMethod(int)getLength()
Nếu bạn có thể xem mã nguồn của phương thức open(String) thì bạn sẽ thấy nó tạo ra thực thể lớp con của HttpConnection.
Giống như phương thức getAnimal(int) nó trả về kiểu Animal, thực sự thì nó trả về Human, Cat hoặc Bird là các lớp con của Animal, mà các lớp con này các phương thức đã được cài rồi.

Lúc mới học mình tự hỏi: "thằng điên nào tạo ra cái giao tiếp làm gì cơ chứ, nó chẳng tạo được thực thể, mỗi lần gọi nó thì phải cài lại các phương thức của nó, rắc rối!"
Đến khi mình làm nhiều thì mới biết, nó thực sự quan trọng, nếu không có nó, có thể mất đi nhiều thứ ở lập trình hướng đối tượng. Nó giống như là một tiêu chuẩn định sẵn.
Như kiểu: Mỗi làng (giao tiếp) phải có một cái cổng, một cái giếng, và một cái đình, Tết phải tổ chức lễ hội vui chơi... (thuộc tính hoặc phương thức). Nói thế tức là không phải làng (lớp) nào cũng phải là hình dáng, tổ chức,... mấy thứ đó giống nhau. Mỗi làng có cách xây cất, vui chơi (cài đặt) riêng.

Có một điều nhỏ là phương thức open(String) không trả về trực tiếp kiểu HttpConnection thì phải, vì thấy bạn ép kiểu, có thể nó trả về một giao tiếp cha của HttpConnection.
 

gorkiit

Active Member
5/4/10
138
35
28
Thanh Hóa
Vì trong cái HttpConnection có 2 method ấy mà bạn. Cái này chỉ là khai báo và gán giá trị cho nó chứ không tạo(khởi tạo new ) như bạn nghĩ đâu nhé và trong các method ấy chắc chắn sẽ k có action nào.
 
  • Like
Reactions: JackV

JackV

Administrator
Staff member
Vì trong cái HttpConnection có 2 method ấy mà bạn. Cái này chỉ là khai báo và gán giá trị cho nó chứ không tạo(khởi tạo new ) như bạn nghĩ đâu nhé và trong các method ấy chắc chắn sẽ k có action nào.
Bạn gorkiit trả lời chính xác rồi đó bạn, đây là một trong các đặc điểm của tính đa hình với hướng đối tượng.
HttpConnection hc = new HttpConnection() mới là có vấn đề.
 
  • Like
Reactions: bachkhoa752

bachkhoa752

Member
7/6/13
31
1
8
27
Các ơn các bác nhiều nhé
e đã hiểu thêm rất nhiều.
Đặc biệt là bác SITUVN đã có cho mình ví dụ rất dễ hiểu. Thanks bác
Lúc mới học mình tự hỏi: "thằng điên nào tạo ra cái giao tiếp làm gì cơ chứ, nó chẳng tạo được thực thể, mỗi lần gọi nó thì phải cài lại các phương thức của nó, rắc rối!"
Đến khi mình làm nhiều thì mới biết, nó thực sự quan trọng, nếu không có nó, có thể mất đi nhiều thứ ở lập trình hướng đối tượng. Nó giống như là một tiêu chuẩn định sẵn.
Rất thích câu này của bác:D
 
  • Like
Reactions: Androider

khangphamngoc90

Algorithms Master
Staff member
2/4/11
382
145
43
Tại sao các chuyên gia,các kỹ sư lâu năm về Java lại khuyên "Làm việc với interface luôn tốt hơn so với implementation trong phát triển phần mềm!" nó luôn có nguyên nhân đấy.:)
 
  • Like
Reactions: bachkhoa752

JackV

Administrator
Staff member
Tại sao các chuyên gia,các kỹ sư lâu năm về Java lại khuyên "Làm việc với interface luôn tốt hơn so với implementation trong phát triển phần mềm!" nó luôn có nguyên nhân đấy.:)
Thường thì viết phần mềm nhỏ không quan tâm đến interface :D
Anh Kháng nhà mình nói như kiểu "quăng bom chém gió phun mưa" í ;)) Vậy là anh Kháng nhà mình sắp viết hướng dấn về sử dụng Interface đây ;)
 
  • Like
Reactions: gorkiit

khangphamngoc90

Algorithms Master
Staff member
2/4/11
382
145
43
Phần mềm nhỏ chỉ để các bạn học và tìm hiểu thôi,khi phát triển hệ thống lớn,phức tạp mà coi trọng implement hơn interface thì sớm muộn cũng phát sinh vấn đề nghiêm trọng về code smell hoặc bảo trì hệ thống...:|
 

Joe

Thành viên VIP
21/1/13
2,971
1,312
113
My girlfriend told me about a Vietnamese proverb "A yawning blind dog luckily catches a pass-by fly". Lot of "Phần mềm" makers tinker around things that don't require a thorough thought, but simple chores...and think they don't need a thorough thought. Even the simplest form must be thought thoroughly. Example: Walking. if your brain won't thoroughly balance your body you walk like a drunk...
 
  • Like
Reactions: khangphamngoc90

khangphamngoc90

Algorithms Master
Staff member
2/4/11
382
145
43
@all: Mình sẽ viết 1 câu chuyện nối tiếp câu chuyện của bác pain "Nàng Bạch Tuyết và 7 chú lùn" các bạn đón đọc nhé :|