Страницы

Поиск по вопросам

понедельник, 10 февраля 2020 г.

Переопределение метода экземпляра класса

#java #классы #методы


Мне нужно переопределить метод класса Button

public class Button { 
    public void action(){} 
}


Я пробовал инициализировать так:

Button home = new Button(){
    public void action() {
        // TODO some code
    }
}


Но ничего не получилось. Нужна помощь.
    


Ответы

Ответ 1



Но ничего не получилось. А в чем заключается это «не получилось»? Если при вызове переопределенного метода Вы получаете cannot resolve method, то, может быть, Вы импортировали вовсе не Ваш класс Button, а одноименный класс из другого пакета, который данного метода не имеет? При создании экземпляра некоторого класса Вы можете переопределить его методы, в итоге получите анонимный класс (а точнее, субкласс). Пример: class Button { public void action() { System.out.println("Basic implementation"); } } public class Main { public static void main(String[] args) { Button button = new Button() { @Override public void action() { System.out.println("Overridden implementation"); } }; button.action(); } } Вывод на консоль: Overridden implementation Если же класс с переопределенными методами будет использован многократно, то целесообразно создать именованный класс.

Ответ 2



Наследование никто не отменял. public class MyButton extends Button { @Override public void action(){ // переопределённая логика тут } } Button home = new MyButton();

Ответ 3



Вижу 3 способа решить проблему: 1) Классический способ через переопределение - как указано в ответе коллег по цеху (например @АндрейБогатов) 2) Через переопределение слушателя action() (очевидно, класс Button должен иметь слушателя что-то типа setOnActionListener() с соответствующим интерфейсом OnActionListener) - к сожалению ТС не дал ссылку на оригинальный класс Button - иначе я бы написал пример 3) Путь героя - написать собственный ClassLoader, который в рантайме загружает нужный class, что то типа (но это уже мозговой вывих, который применяется крайне редко): class MyClassLoader extends ClassLoader { public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(...); } private byte[] loadClassData(String name) { // загрузчик класса в вашей имплементации . . . } }

Комментариев нет:

Отправить комментарий