#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) { // загрузчик класса в вашей имплементации . . . } }
Комментариев нет:
Отправить комментарий