2012-06-17 14 views
6

thể trùng lặp:
Adding Extra method to interfaceThêm phương pháp mới trong giao diện Java vì vậy nó liên quan đến thay đổi tối thiểu đến các lớp học kế thừa

Có kịch bản mà tôi có Interface X, đã được thực hiện với hàng ngàn của tôi các lớp học. Bây giờ tôi muốn thêm phương thức mới vào số Interface X. Vì vậy, cách thực hiện các thay đổi theo cách tối thiểu để giải quyết vấn đề ghi đè các phương thức trong tất cả các lớp của tôi

+0

Thay đổi giao diện thành lớp trừu tượng và cung cấp triển khai cơ sở? –

+8

Bạn có hàng ngàn lớp học? Wow. –

+0

@verisimilitude Chẳng phải giải pháp đó sẽ sớm tạo ra một cơn ác mộng bảo trì và giới thiệu rất nhiều giao diện cho hệ thống? – Thihara

Trả lời

1

Không có cách nào dễ dàng để thực hiện điều đó. Nếu bạn thêm một phương thức vào giao diện thì tất cả các lớp thực thi phải ghi đè lên nó. Nếu bạn thay đổi giao diện thành một lớp trừu tượng thì bạn phải cấu trúc lại các lớp thực hiện.

Nhưng bạn có phân cấp lớp phải không? Vì vậy, bạn có thể giảm thiểu công việc bằng cách thực hiện phương thức đó chỉ trong các lớp cơ sở. Nhưng điều đó phụ thuộc vào yêu cầu cụ thể và chi tiết của bạn vì vậy tôi đoán thực hiện hạnh phúc!

Và nếu không có phân cấp lớp dễ dàng nào bạn có thể sử dụng để triển khai các phương pháp mới như vậy thì có lẽ đã đến lúc bạn nghĩ về việc viết lại lớn để ủng hộ việc giảm nỗ lực bảo trì trong tương lai.

+1

Bạn đã đọc liên kết @verisimilitude đã đăng trong nhận xét chưa? Nếu bạn không, thì hãy đọc nó, nó sẽ thay đổi câu trả lời của bạn và quan điểm của bạn. –

+0

Có nhưng điều đó sẽ không dẫn đến sự cố bảo trì sớm hay muộn? Ngoài ra nó phụ thuộc vào loại phương pháp đang được giới thiệu, nếu phương pháp được đề cập là một cái gì đó sẽ được sử dụng ở mọi nơi trên giao diện nếu được sử dụng làm loại thì giải pháp này sẽ không giúp được nhiều ... – Thihara

+0

Nó thực sự phụ thuộc, nếu bạn có một bó, tức là 10+, các lớp và bạn chỉ muốn một số trong số đó, tức là 2, sau đó nó sẽ giống như 2 lớp thực hiện phương thức mới và 8+ có nó mà không cần triển khai (thiết kế khá xấu). Nếu tất cả các lớp thực hiện giao diện thực tế nên có phương thức mới này, thì câu hỏi OP sẽ không đúng chỗ và tôi không nghĩ OP cần :). –

11

tôi sẽ tạo ra một phần mở rộng của giao diện của bạn cho chỉ các lớp học cần những phương pháp thêm ...

public interface BaseInterface { 
    public int exampleMethod(); 
} 

public interface ExtendedInterface extends BaseInterface { 
    public int anotherMethod(); 
} 

Các hàng ngàn lớp học đã thực hiện BaseInterface. Đối với các lớp cần phương thức bổ sung, bạn thay đổi chúng để triển khai ExtendedInterface.

Nếu đối tượng của bạn được lưu trữ trong bộ sưu tập chẳng hạn như một mảng BaseInterface[], điều này vẫn hoạt động vì các đối tượng thuộc loại ExtendedInterface cũng là đối tượng thuộc loại BaseInterface, vì vậy chúng vẫn có thể được lưu trữ trong cùng một bộ sưu tập chung.

Ví dụ, đây là vẫn hoàn toàn hợp lệ ...

BaseInterface[] objects = new BaseInterface[2]; 
objects[0] = new ClassThatImplementsBaseInterface(); 
objects[1] = new ClassThatImplementsExtendedInterface(); 

Tuy nhiên, nếu bạn cần truy cập vào phương pháp mới của ExtendedInterface, nhưng đối tượng được lưu trữ trong một bộ sưu tập BaseInterface, bạn sẽ cần để đúc nó vào một ExtendedInterface trước khi bạn có thể sử dụng nó ...

BaseInterface[] objects = new BaseInterface[1]; 
objects[0] = new ClassThatImplementsExtendedInterface(); 

if (objects[0] instanceof ExtendedInterface){ 
    // it is an ExtendedInterface, so we can call the method after we cast it 
    ((ExtendedInterface)objects[0]).anotherMethod(); 
} 
else { 
    // it is a BaseInterface, and not an ExtendedInterface 
} 

Điều này có thể hoặc không phù hợp, tùy thuộc vào mức sử dụng của bạn.

Nếu bạn thực sự cần tất cả hàng nghìn đối tượng để thực hiện phương pháp mới, bạn sẽ phải thêm phương thức vào BaseInterface và sau đó sử dụng tính năng của IDE hoặc trình soạn thảo văn bản để thực hiện phương pháp trong tất cả các lớp của bạn. Ví dụ: bạn có thể mở tất cả trong trình chỉnh sửa văn bản và thực hiện tìm kiếm thay thế cho tìm điều gì đó phổ biến đối với mỗi lớp và thay thế bằng mã chung + mã mặc định cho phương pháp mới. Khá nhanh và không đau. Tôi chắc chắn rằng một số IDE có lẽ cũng sẽ tự động thêm khai báo phương thức cho tất cả các lớp kế thừa, hoặc ít nhất có một tùy chọn để làm điều này trong một menu chuột phải.

+0

Đây là điều tương tự như đã nói. – paulsm4

+0

Đồng ý, nhưng điều này là cụ thể hơn cho yêu cầu của người dùng, có ví dụ mã hóa trong đó, và theo ý kiến ​​của tôi là dễ hiểu hơn nhiều so với bài liên kết. Thêm vào đó, tôi chỉ tình cờ đồng ý với cách tiếp cận này, vậy tại sao không viết câu trả lời cho hiệu ứng đó. – wattostudios

2

Nếu phương pháp mới là một phần mở rộng thực sự của giao diện, thì điều phải làm là chỉnh sửa giao diện và sử dụng các công cụ môi trường phát triển của bạn để tìm tất cả các vị trí cần thực hiện chức năng mới. Sau đó làm công việc. Eclipse và Netbeans sẽ làm một công việc tốt.

[NB Tôi là một chút ngạc nhiên rằng các công cụ refactoring không chăm sóc của một số các nỗ lực sử dụng, nhưng cho nó được.]

Nếu phương pháp mới sẽ không được gọi là hầu hết thời gian trong mã cũ, hãy xem xét giao diện mới là một phần mở rộng của một tuổi:

public interface NewInterface extends OldInterface { 
    void newMethod(); 
} 

Nếu bạn có nhu cầu để vượt qua đối tượng giao diện cũ cho người tiêu dùng giao diện mới với một phiên bản null newMethod(), bạn có thể làm như sau:

public class NewInterfaceWrapper<T extends OldInterface> implements NewInterface { 

    private T wrapped; 

    public NewInterfaceWrapper(T wrapped) { 
     this.wrapped = wrapped; 
    } 

    // Define all the old interface methods and delegate to wrapped.method 

    // Now provide the null implementation of new method. 
    void newMethod() { } 
} 

... 

wantsNewInterface(new NewInterfaceWrapper(oldImplementer)); 

Nó không đẹp, nhưng các hệ thống lớn thường phát triển các cạnh thô như thế này khi chúng già đi.

+0

Có vẻ như WATTO Studios và tôi có cùng một ý tưởng. Vui lòng xóa nếu điều này không hữu ích. – Gene

+0

Giữ bài đăng của bạn - bạn đã có một cách tiếp cận khác với trình bao bọc - tôi đã không nghĩ về điều đó! – wattostudios

Các vấn đề liên quan