래퍼 클래스의 내부 필드로 메소드 호출을 리디렉션하기위한 Super와 동일합니까?
문제
수업을 만들고 싶다고 말하자 MyString
그것은 래퍼입니다 java.lang.String
. 새로운 방법을 추가했습니다 reverse
.
public class MyString {
private String text=null;
public MyString(String foo){
text=foo;
}
public String reverse(){
// implementation omitted
return reversedString;
}
}
지금 String
최종입니다. 그러므로 나는 그것을 확장 할 수 없습니다. 가질 수있는 한 가지 방법 MyString
모든 방법을 지원합니다 String
지원은 메소드와 같은 래퍼 메소드 구현을 제공하는 것입니다. toCharArray()
:
public char[] toCharArray(){
// redirect to String member field 'text'
return text.toCharArray();
}
실제로 래퍼 구현을 코딩하지 않고도 메소드 호출을 멤버 필드로 리디렉션 할 수있는 방법이 있습니까? 슈퍼와 비슷한 것이 있습니까?
해결책
아니요, 직접 수행 할 수 없습니다.
모든 java.lang.string 메소드 (메소드)가 포함 된 인터페이스를 정의하고 동적 프록시 문자열 구현으로 리디렉션 (모든 부정적인 의미 포함 동적 프록시).
아마도 당신은 더 나은 것입니다 유형 변환 new MyString(string).reverse()
불행히도 Java는 가지고 있지 않습니다 C#의 확장 방법 또는 Scala의 암시 적 유형 변환.
물론 충분합니다 역 구현, 예를 들어 아파치 커먼즈 라이브러리. 절차 적 스타일로 구현됩니다.
String reversed = StringUtils.reverse(string);
(귀하의 역 메소드는 문자열이 아닌 MyString을 반환해야한다고 생각합니다. s.reverse().reverse()
).
다른 팁
내가 질문을 완전히 이해하는지 확실하지 않지만 궁극적으로 당신이 원한다면 MyString
동일한 방법과 동일한 방법을 갖습니다 String
, 그러면 어느 수준에서 당신의 클래스는 동일한 방법을 모두 정의해야합니다. 당신은 정말로 이것을 돌아 다닐 수 없습니다.
아마도 모든 방법에 대해 입력 할 필요가 없도록 깔끔한 방법을 생각 해낼 수 있습니다. return text.blah()
, 그보다 더 우아한 것; 그러나 나는 당신이 당신의 메소드 정의를 피할 수있는 방법을 보지 못합니다. MyString
조금도.
사용하기 위해 노출하려면 방법을 작성해야 하므로이 작업을 수행 할 수 없습니다. 그러나 예를 들어 NetBeans의 "Create Delegates ..."기능을 사용할 수 있으며 일부 마우스 클릭으로 모든 대의원 메소드를 얻을 수 있습니다.