Существует ли эквивалент super для перенаправления вызовов методов во внутренние поля в классах-обёртках? - PullRequest
2 голосов
/ 22 октября 2009

Допустим, я хочу создать класс 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();
}

Есть ли способ, которым я могу перенаправить вызовы метода в поле члена без необходимости кодировать реализацию оболочки? Что-то похожее на супер?

Ответы [ 3 ]

2 голосов
/ 22 октября 2009

Нет, это нельзя сделать напрямую.

Вы можете определить интерфейс, содержащий все методы java.lang.String (плюс ваши методы) и реализовать его с помощью динамического прокси , перенаправляющего на реализацию строки (со всеми отрицательными последствиями dynamic прокси ).

Вероятно, вам лучше с преобразованием типов new MyString(string).reverse() к сожалению, в Java нет методов расширения C # или неявных преобразований типов Scala .

Конечно, существует множество обратных реализаций , например, из библиотеки apache commons . Это реализовано в процедурном стиле:

String reversed = StringUtils.reverse(string);

(я думаю, ваш обратный метод должен возвращать MyString, а не String, поэтому вы можете написать: s.reverse().reverse()).

1 голос
/ 22 октября 2009

Вы не можете сделать это, поскольку вам нужно написать методы, чтобы выставить их для использования. Но, например, вы можете использовать функцию Netbeans «Создать делегатов ...» и получить все методы делегатов одним щелчком мыши.

1 голос
/ 22 октября 2009

Не уверен, что я полностью понимаю вопрос, но в конечном итоге, если вы хотите, чтобы ваш MyString имел все те же методы, что и String, то на каком-то уровне ваш класс также должен иметь все те же методы, определенные. Вы не можете обойти это.

Вы, вероятно, можете придумать аккуратные способы, чтобы для каждого метода вам не приходилось вводить return text.blah(), что-то более элегантное, чем это; но я не понимаю, как вообще можно было бы избежать определения методов в вашем MyString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...