자바 의 functor 구현

csdn 작성 자:wangfengsdu
리 턴 함수(callback function)라 는 개념 을 자주 들 습 니 다.리 턴 함수 란 이 함수 가 먼저 어 딘 가 에 등록 하고 나중에 필요 할 때 호출 되 는 것 을 말 합 니 다.예 를 들 어 SDK 를 이용 하여 윈도 프로 그래 밍 을 할 때 우 리 는 WNDCLAS 클래스 를 등록 해 야 한다.이 클래스 에는 이러한 인자 lpfnWNProc 가 있 는데 메시지 처 리 를 하려 면 메 시 지 를 처리 하 는 함수 의 지침 으로 값 을 부여 해 야 한다.메시지 처리 함 수 는 언제 호출 되 었 습 니까?우 리 는 프로그램 에서 명시 적 으로 보지 못 했다.OS 호출 이 야.  이것 은 SDK 의 시험 방식 으로 당연히 프로 세 스 식 언어 C 를 사용 하여 함 수 를 전달 하 는 지침 을 통 해 실현 할 수 있다.
C++에서 어떻게 이 루어 지나 요?물론 C++호 환 C 는 함수 포인터 로 하면 됩 니 다.  이 동시에 C++는 대상 을 대상 으로 하 는 체 제 를 제공 하 는데 서로 다른 실현 체 제 를 가 질 수 있 습 니까?  당연 하지!STL 의 functor(Function object)는 리 셋 에 사용 할 수 있 습 니 다.  예 를 들 어 int 데 이 터 를 저장 하 는 vector 에 대해 정렬 을 줄 이면 우 리 는 이렇게 할 수 있 습 니 다.
  sort(vec.begin(),vec.end(),greater());
   greater()
  
바로 우리 가 전달 한 익명 의 대상 입 니 다.함수 호출 연산 자'()'를 다시 불 러 옵 니 다.우 리 는 이 대상 에서 제공 하 는 함 수 를 명시 적 으로 호출 하지 않 았 습 니 다.sort 함 수 는 대상 안의 함수 에 대해 callback 을 진행 합 니 다.
자바 에서 functor 와 유사 한 기능 을 실현 하려 면 어떻게 해 야 합 니까?Command 모드 가 도움 이 됩 니 다.command 모드 는 간단 해 보 입 니 다.command 를 인터페이스 에 봉 하기 만 하면 됩 니 다.Command 모드 는 리 셋 메커니즘 의 대상 을 대상 으로 하 는 대체 품 입 니 다.
예 를 들 어 자바.io 에서 정 의 된 인터페이스
      public interface FilenameFilter {
          boolean accept(File dir, String name);
  
    }
이 FilenameFilter 는 Command 입 니 다.Command 를 실현 하 는 클래스 는 Concretecond 입 니 다.이 인터페이스 에서 설명 하 는 동작 인"accept"는 디 렉 터 리 dir 의 파일 name 이 어떤 요 구 를 만족 시 키 는 지 확인 하 는 것 입 니 다.만족 하면 true 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.이 요 구 는 무엇 입 니까?너 는 이 인 터 페 이 스 를 실현 해 야 한다.예 를 들 어 이 파일 의 이름 에 지정 한 문자열 이 포함 되 어 있 지 않 은 지 보고 싶 으 면 다음 종 류 를 정의 할 수 있 습 니 다.
   class DirFilter implements FilenameFilter {
        private String afn;
        public DirFilter(String afn){
            this.afn = afn;
        }  
        public boolean accept(File dir, String name){
            String f = new File(name).getName();
            return f.indexOf(afn) != -1;
        }
    }
어떻게 사용 하나 요?File 클래스 에 이런 방법 이 있어 요.
      public String[] list(FilenameFilter filter)
그래서 우 리 는 이렇게 할 수 있다.
      File file = new File(".");
      String[] list = file.list(new DirFilter("wf"));
받 은 list 는 물론 디 렉 터 리 에 문자열'wf'를 포함 하 는 모든 파일 이름 의 문자열 배열 입 니 다.어때요? C++의 functor 와 차이 가 많 지 않 나 요?

좋은 웹페이지 즐겨찾기