Hỏi về interface trong java

Xin chào mọi người. Mình có Một vấn đề về java như thế này.

Mình code 1 interface trong interface chỉ có một phương thức duy nhất và 1 class (Tên : A) khác có implement interface. và trong class có 3 phương thức 1 của interface và 2 pt còn lại là get và set.
Vậy bây giờ mình tạo thêm 2 class (Tên: B, C ) nữa cũng implement interface.

Câu hỏi là : Làm sao để đối tượng của class A gọi tới phương thức ở class A mà lại thực hiện 2 phương thức ở 2 class mới tạo là (B, C). trong một hàm main ở class main.

Theo mình nghĩ thì không được

Có đó Bạn, mình đang làm cái bt có kiểu đó :confounded:

Ý bạn là nó gọi phương thức trong interface hả? Trừ khi B và C vừa implements cái interface vừa extends của A. Ý bạn có phải là upcasting với downcasting trong kế thừa ko nhỉ?

Theo như bạn nói thì câu này có thể áp dụng khái niệm composition trong java, cụ thể được giải quyết như sau: :wink:

1 .Đầu tiên mình tạo một interface có tên là Interface , trong interface này có 1 abstract method tên là show()

public interface Interface {
  public void show();
}

2 . Tạo 2 class BC implement interface ở trên và hiện thực hóa method show() của riêng nó :wink:

 public class B implements Interface {
  @Override
  public void show() {
  System.out.println("B");
  }
 }
public class C implements Interface {
 @Override
 public void show() {
  System.out.println("C");
 }
}

3 . Tạo class A cũng implement interface, nhưng trong class A sẽ có 2 instance variable của interface Interface, mình đặt tên là bc. Và 2 variable này sẽ được khởi tạo trong contructor của class A :wink:

public class A implements Interface {
private Interface b, c;
public A() {
  b = new B();
  c = new C();
}

@Override
public void show() {
System.out.println(“A”);
b.show();
c.show();
}
}

Đến đây, nếu bạn muốn có thêm method get, set thì tùy. Trong ví dụ này mình không cần, nếu thêm vào thì get, set cụ thể như sau:

public Interface getB() {
  return b;

}

public void setB(Interface b) {
this.b = b;
}

public Interface getC() {
return c;
}

public void setC(Interface c) {
this.c = c;
}

4 . OK. Việc cuối cùng là tạo hàm main :smiley: và gọi method của class A

public class Main {
    public static void main(String[] args) {
  A a = new A();
  a.show();
 }
} 

Kết quả sẽ in ra là:

A
B
C

:blush:

upcasting , downcasting Là j Bạn ?

Cảm ơn Bạn nha, Nhưng với yêu cầu là cái thằng a nó k được thay đổi code. Nhưng dù sao cũng cảm ơn Bạn tư duy thêm xíu chắc ok.

Theo mình biết là nó áp dụng trong kế thừa,

  • upcasting là che dấu những phương thức của lớp dẫn xuất ( cái lớp dẫn xuất có mà lớp cơ sở ko có )
  • downcasting là làm hiện ra những phương thức đã bị ẩn đi ( hay đã bị upcasting trước đó )
  • downcasting chỉ xh khi có upcasting trước rồi
    vd : Có 2 class, class B extends class A
    class A {

    public void show(){
    System.out.println(“this is A”);
    }
    }

    class B extends A {

     public void add(){}
     
     @Override
     public void show() {
     	System.out.println("this is B");
     }
    

    }

    public class Upcasting {
    public static void main(String [] args) {
    B b1 = new B();
    A a1 = (A) b1; // cách upcasting
    a1.add(); // không thể gọi add() do đã bị che đi
    a1.show();

     	B b2 = (B) a1; // cách downcasting
     	b2.add(); // thực hiện được do đã hiện ra phương thức bị ẩn
     }
    

    }

vậy ý của bạn có phải là như này:

Lúc này class BC vừa implement Interface vừa extend luôn class A

public class B extends A implements Interface {
  @Override
  public void show() {
  System.out.println("B");
  }
}
 public class C extends A implements Interface {
  @Override
  public void show() {
  System.out.println("C");
  }
 }

và cuối cùng trong hàm main sẽ như sau:

public class Main {
public static void main(String[] args) {
  A a = new A();
  a.show();
  a = new B();
  a.show();
  a = new C();
  a.show();
}
}

Kết quả vãn giống như trên:

A
B
C

Đúng ý bạn chưa nhỉ :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?