2013-06-15 11 views
5

Moja klasa implementuje ActionListener. I wprowadziły następujące klasy zagnieżdżone poniżej:Należy zastosować odziedziczoną metodę abstrakcyjną

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 

Jednak Eclipse wciąż mówią mi, że moja klasa musi implementować dziedziczone metody abstrakcyjne ActionListener.actionPerformed (ActionEvent e). Czy w ten sposób nie można zaimplementować zastąpienia metod w klasie zagnieżdżonej?

+0

Głosowanie w dół anulowane z wyższym wynikiem głosowania. Nie wiem, dlaczego ktoś głosował na to pytanie, ponieważ wydaje mi się, że jest to dla mnie ważne pytanie. –

+0

++ z powodu odpowiedzi @ HovercraftFullOfEels :) – Azad

Odpowiedz

8

Twoje pytanie:

Czy nie można wprowadzić w życie metody nadpisywania w zagnieżdżonych klasy w ten sposób?

Odpowiedź brzmi: nr. Eclipse (właściwie Java) skarży się, że gdy jesteś deklarując swoją klasę jako wdrożenie ActionListener nie jesteś podając swoje klasa niezbędną actionPerformed(...) metodę w własnym zakresie klasy - i to ostatnia część jest bardzo ważne. Klasa implementująca interfejs musi implementować wszystkie wymagane metody interfejsu we własnym zakresie, a nie w klasach zagnieżdżonych. Zauważ, że nie zapobiega to zagnieżdżaniu klas, które implementują również ActionListener lub inne interfejsy, ale niezależnie od tego, reguła pozostaje taka, że ​​klasa nie abstrakcyjna, która implementuje interfejs, musi przesłonić metody interfejsu tego interfejsu.

Ale ponieważ nie używasz obiektów klasy jako ActionListener, prostym rozwiązaniem jest nie deklarowanie swojej klasy jako implementującej interfejs ActionListener. Problem rozwiązany. W rzeczywistości znacznie lepiej jest nie mieć własnej klasy GUI implementującej interfejsy nasłuchujące, ponieważ łączenie ich w jedną klasę powoduje, że klasa robi zbyt wiele. Z technicznego punktu widzenia niepotrzebnie zmniejsza to spójność klasy i ryzyko zwiększenia sprzężenia, co zmniejsza jego czytelność i łatwość konserwacji.

+1

Doszedłem do tego wniosku (GUI nie powinien implementować interfejsów słuchacza) po przeprowadzonych badaniach, które wprowadziły problem, o który pytałem. Interesujące, że standardowa dokumentacja Oracle wydaje się brakować jakiegokolwiek odniesienia do tego, jak poprawnie zaimplementować actionlisteners w dużym menu systemu. – Daniel

+0

@Daniel: Myślę, że dokumentacja Oracle jest dobrym punktem wyjścia do nauki podstaw Huśtawki, ale to jest tak daleko, jak to możliwe. Osobiście staram się nauczyć tajników tworzenia i utrzymywania dużych aplikacji Swing i staram się, aby był jak najbardziej czysty w odniesieniu do MVC, odsprzęgania i zastrzyku zależności. Pomocne są artykuły OOP i internetowe prezentacje wideo. –

Powiązane problemy