2013-06-15 8 views
5

내 클래스는 ActionListener를 구현합니다.상속 된 추상 메서드를 구현해야합니다.

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 

그러나, 이클립스는 여전히 내 클래스는 상속 된 추상 메소드 ActionListener.actionPerformed (의 ActionEvent e)를 구현해야 내게 말하고있다 : 나는 아래에 다음과 같은 중첩 된 클래스를 구현했습니다. 이런 식으로 중첩 클래스에서 override 메서드를 구현할 수 있습니까?

+0

아래로 투표가 취소되었습니다. 나는 그것이 왜 내게 유효한 질문 인 것처럼 보이는가에 대해이 질문에 반대 한 이유가 확실하지 않다. –

+0

++ 때문에 @ HovercraftFullOfEels의 답변 : – Azad

답변

8

귀하의 질문 :

는이 방법으로 중첩 된 클래스에서 재정의 방법을 구현하지 수 있습니까?

대답은 아니요입니다. 이 마지막 부분 매우 중요하다 - 이클립스 (실제로 자바는) 당신이 당신의 클래스 클래스의 자신의 범위에서 필요한 actionPerformed(...) 방법을 제공하지 않을 ActionListener를 구현으로 클래스를 선언하는 동안 것은 불평한다. 인터페이스를 구현하는 클래스는 모든 인터페이스의 필수 메서드를 중첩 클래스가 아닌 자체 범위에 구현해야합니다. 이것은 ActionListener 또는 다른 인터페이스도 구현하는 클래스를 중첩하지 못하도록하지만, 인터페이스를 구현하는 비 추상 클래스는 all 인터페이스의 메서드를 재정의해야합니다.

하지만 클래스의 객체를 ActionListener로 사용하지 않으므로 간단한 해결책은 클래스를 ActionListener 인터페이스를 구현하는 것으로 선언하지 않는 것입니다. 문제 해결됨. 그리고 실제로는 GUI 클래스가 리스너 인터페이스를 구현하지 않는 것이 훨씬 낫습니다. 하나의 클래스에서이를 결합하면 클래스에 너무 많은 것을 요구하기 때문입니다. 기술적 인면에서 불필요하게 클래스의 응집력을 줄이고 커플 링을 증가 시키면 가독성과 유지 보수성이 떨어질 수 있습니다.

+1

내가 결론을 내 렸습니다. GUI가 리스너 인터페이스를 구현해서는 안됩니다. 오라클의 표준 문서에는 대규모 메뉴 시스템에서 액션 리스너를 올바르게 구현하는 방법에 대한 참조가 부족한 것 같습니다. – Daniel

+0

@Daniel : 오라클 문서는 Swing의 기초를 배우기위한 좋은 출발점이라고 생각합니다. 그러나 그 내용은 현재까지입니다. 저 자신은 대규모 Swing 응용 프로그램을 만들고 유지 관리하고 MVC, 디커플링 및 종속성 주입과 관련하여 최대한 깨끗하게 유지하려고 노력하고 있습니다. OOP 기사 및 온라인 비디오 프레젠테이션이 도움이되고 있습니다. –

관련 문제