30/09/2018, 19:19

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.

Truong Pham viết 21:25 ngày 30/09/2018

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

Lê Đại Tú viết 21:35 ngày 30/09/2018

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

Vu Van Chung viết 21:25 ngày 30/09/2018

Ý 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ỉ?

kien tran viết 21:34 ngày 30/09/2018

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:

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ó

 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

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 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

Lê Đại Tú viết 21:30 ngày 30/09/2018

upcasting

upcasting , downcasting Là j Bạn ?

Lê Đại Tú viết 21:20 ngày 30/09/2018

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.

Hai viết 21:32 ngày 30/09/2018

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
     }
    

    }

kien tran viết 21:28 ngày 30/09/2018

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ỉ

Bài liên quan
0