2011-05-09 45 views

Trả lời

21

này tôi đang sao chép và dán từ một số liên kết (i trước đó đã làm và chia sẻ với bạn) Có thể có thể giúp bạn một chút.

1)

interface employee{ 
class Role{ 
     public String rolename; 
     public int roleId; 
} 
Role getRole(); 
// other methods 
} 

Trong giao diện trên bạn phải ràng buộc Vai trò gõ mạnh vào giao diện người lao động (employee.Role). 2) Với một lớp tĩnh bên trong một giao diện, bạn có khả năng rút ngắn một đoạn chương trình chung: Kiểm tra nếu một đối tượng là một thể hiện của một giao diện, và nếu như vậy gọi một phương thức của giao diện này. Nhìn vào ví dụ này:

public interface Printable { 
    void print(); 

    public static class Caller { 
     public static void print(Object mightBePrintable) { 
       if (mightBePrintable instanceof Printable) { 
         ((Printable) mightBePrintable).print(); 
       } 
     } 
    } 
} 

Bây giờ thay vì để làm điều này:

void genericPrintMethod(Object obj) { 
    if (obj instanceof Printable) { 
     ((Printable) obj).print(); 
    } 
} 

Bạn có thể viết:

void genericPrintMethod(Object obj) { 
     Printable.Caller.print(obj); 
    } 
5

Tổ chức.

Chỉ định lớp bên trong giao diện liên kết lớp đó trực tiếp với giao diện đó - khách hàng sử dụng giao diện đó sẽ có quyền truy cập vào lớp đó và tất cả chức năng mà nó cung cấp.

Tôi đã nhìn thấy mẫu của một lớp bên trong một giao diện thực sự chỉ trong Java 1.4 và thấp hơn để cung cấp một kiểu liệt kê để đi cùng với giao diện - vì giao diện chỉ có thể sử dụng lớp và lớp đó có thể được bảo vệ , các máy khách sử dụng giao diện chỉ có thể chấp nhận các cá thể của lớp được định nghĩa trong giao diện như các giá trị được liệt kê. Đó chỉ là ví dụ duy nhất tôi có thể nghĩ ra - Tôi chắc rằng những người khác tồn tại, nhưng hiếm khi tôi thấy một lớp bên trong một giao diện được sử dụng.

Đối với trường hợp lật, nó vẫn là tổ chức. Chỉ định một giao diện bên trong một lớp biểu thị rằng chỉ có lớp đó nên sử dụng giao diện. Các lớp và giao diện khác vẫn có thể sử dụng giao diện đó, tùy thuộc vào cấp truy cập của nó, không phải là vấn đề - tổ chức ghi lại ý định của giao diện - chỉ được sử dụng trong lớp có chứa nó.

Nếu nó hữu ích bên ngoài lớp đó, nó phải được di chuyển phù hợp với loại riêng của nó. Vì vậy, cả hai cách sử dụng này đều hiếm, nhưng việc sử dụng chúng chủ yếu để tổ chức mã và ghi lại ý định của nó trực tiếp thông qua cú pháp Java.

+0

Tôi nghĩ rằng một số đoạn mã có thể hữu ích ở đây. –

+0

Tôi nghĩ rằng một ví dụ đã được đưa ra trong http://stackoverflow.com/a/10481539/1083704 – Val

1

Nếu bất kỳ chức năng lớp nào liên kết chặt chẽ với bất kỳ giao diện nào trong tình huống đó, chúng tôi khai báo một lớp trong giao diện.

Một thời gian cũng hữu ích khi cung cấp triển khai mặc định phương thức trừu tượng bên trong giao diện.

0

tạo lớp bên trong giao diện cho phép lập trình viên có các hạn chế về lớp tức là lớp bên trong chỉ có thể truy cập được nếu chúng tôi triển khai giao diện đó.

+0

Không, nó không đúng, chúng ta có thể truy cập các lớp bên trong mà không cần triển khai thực hiện - 'InterfaceName.ClassName a = new InterfaceName.ClassName (); a.print (10); ' –

3

Nếu chức năng của một lớp được liên kết chặt chẽ với một giao diện và chúng tôi sẽ không sử dụng lớp đó ở bất kỳ đâu thì chúng ta có thể định nghĩa một lớp bên trong một giao diện.

package PracticeTest; 

public interface VehicleService { 
    public void repair(Vehicle v); 
    public class Vehicle{ 
     String vehicleModel; 
     String vehicleNumber; 
     public Vehicle(String vehicleModel, String vehicleNumber) { 
     super(); 
     this.vehicleModel = vehicleModel; 
     this.vehicleNumber = vehicleNumber; 
     } 

    } 
} 

Trong trường hợp phương tiện trên có sẵn cho VehicleService và chúng tôi không sử dụng ở bất kỳ nơi nào khác.

  1. Cung cấp thực hiện mặc định của giao diện chúng ta có thể định nghĩa một lớp bên trong một giao diện

Interface

package PracticeTest; 

public interface VehicleService { 
public void repair(); 
public class DefaultVehicle implements VehicleService{ 

    @Override 
    public void repair() {   
     System.out.println(" Default Repair"); 
    } 
} 

thi Lớp

package PracticeTest; 
public class busRepair implements VehicleService{ 

    @Override 
    public void repair() { 
     System.out.println(" Bus Repair"); 
    } 
    public static void main(String args[]){ 
     busRepair b = new busRepair(); 
     b.repair(); 
     DefaultVehicle d = new DefaultVehicle(); 
     d.repair(); 
    } 
} 
Các vấn đề liên quan