2013-06-15 43 views
5

Lớp của tôi triển khai ActionListener. Tôi đã thực hiện các lớp lồng nhau sau đây:Phải triển khai phương pháp trừu tượng được thừa kế

JMenuItem mntmNew = new JMenuItem("New..."); 
    mntmNew.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      doNew(e); //calls to outer class for cleaner code 
     } 
    }); 
    mnFile.add(mntmNew); 

    JMenuItem mntmLoad = new JMenuItem("Load..."); 
    mntmLoad.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      doLoad(e); //calls to outer class for cleaner code 
     } 
    }); 
    mnFile.add(mntmLoad); 

//etc. for the rest of the menu system 

Tuy nhiên, Eclipse vẫn nói với tôi rằng lớp học của tôi phải thực hiện những kế thừa phương pháp trừu tượng ActionListener.actionPerformed (ActionEvent e). Bạn có thể không thực hiện các phương thức ghi đè trong một lớp lồng nhau theo cách này không?

+0

Đã hủy bỏ phiếu bầu với một cuộc bỏ phiếu. Tôi không chắc tại sao một người nào đó đã bỏ phiếu cho câu hỏi này vì nó dường như là một câu hỏi hợp lệ đối với tôi. –

+0

++ vì câu trả lời của @ HovercraftFullOfEels :) – Azad

Trả lời

8

Câu hỏi của bạn:

Bạn có thể không thực hiện phương pháp ghi đè trong một lớp lồng nhau theo cách này?

Câu trả lời là không. Eclipse (trên thực tế Java) đang phàn nàn rằng trong khi bạn đang khai báo lớp học của bạn như thực hiện ActionListener bạn đã không cho lớp học của bạn các actionPerformed(...) phương pháp cần thiết trong phạm vi riêng của lớp - và phần cuối cùng này là rất quan trọng. Lớp thực hiện giao diện phải thực hiện tất cả các phương thức được yêu cầu của giao diện trong phạm vi riêng của nó và không phải trong các lớp lồng nhau. Lưu ý rằng điều này không ngăn cản bạn lồng các lớp cũng thực hiện ActionListener hoặc các giao diện khác, nhưng không phân biệt, quy tắc vẫn là một lớp không trừu tượng triển khai giao diện phải ghi đè tất cả các phương thức của giao diện.

Nhưng vì bạn không sử dụng các đối tượng trong lớp của mình làm ActionListener, giải pháp đơn giản là không khai báo lớp của bạn khi triển khai giao diện ActionListener. Đã giải quyết được sự cố. Và thực sự bạn tốt hơn rất nhiều khi không có lớp GUI của bạn thực hiện các giao diện người nghe của bạn kể từ khi kết hợp chúng trong một lớp là yêu cầu một lớp làm quá nhiều. Theo thuật ngữ kỹ thuật, nó không nhất thiết làm giảm sự gắn kết và rủi ro của một lớp tăng nó làm giảm khả năng đọc và bảo trì của nó.

+1

Tôi đã đi đến kết luận đó (GUI không nên triển khai giao diện người nghe) sau khi nghiên cứu tôi đã thực hiện, giới thiệu vấn đề tôi đã hỏi. Điều thú vị là tài liệu chuẩn của Oracle dường như thiếu bất kỳ loại tham chiếu nào đến cách thực hiện đúng cách các tác vụ hành động trên một hệ thống menu lớn. – Daniel

+0

@Daniel: Tôi nghĩ rằng tài liệu hướng dẫn của Oracle là một điểm khởi đầu tốt để tìm hiểu những điều thô lỗ của Swing, nhưng đó là như xa như nó đi. Bản thân tôi, tôi đang đấu tranh để tìm hiểu các ins and outs của việc tạo ra và duy trì các ứng dụng Swing lớn và cố gắng giữ cho nó càng sạch càng tốt liên quan đến MVC, tách, và tiêm phụ thuộc. Bài viết OOP và thuyết trình video trực tuyến đang giúp bạn. –

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