Я читал о интерфейсах в Java, и теперь я хочу создать интерфейс, который позволяет мне создать конструкцию, как показано ниже:
public class MyClass implements View.OnTouchListener {
//Implementation
public boolean onTouch(View arg0, MotionEvent arg1) {
/*SOME CODE*/
return true;
}
}
Поэтому я хочу создать аналогичный интерфейс (класс). Как я могу вызвать метод onTouch
из интерфейса OnTouchListener
если я не знаю, какой класс его реализует? И как я могу узнать, какие классы реализуют этот интерфейс, если я решил отделить классы от интерфейса (разные библиотеки)? Надеюсь, ты понимаешь, что я имею в виду.
Большое спасибо!
Я чувствую, что понимаю часть вашего вопроса.
как я могу узнать, какие классы реализуют этот интерфейс, если я решил отделить классы от интерфейса (разные библиотеки)
используя
MyClass myObject = new MyClass();
if(myObject instanceof myInterface){ //if the object implements the interface
/*Do Something*/
}
else{
/*Do Something Else Not Including the Method*/
}
экземпляр слова резерва скажет вам, является ли данный объект экземпляром этого класса - будь то через наследование или реализацию
Дэвид Б. ответил на первую половину вашего вопроса - вызовите onTouch (arg0, arg1) на самом объекте.
myObject.onTouch(arg0,arg1);
Просто увидели ваше редактирование - если вы используете ключевое слово instanceof, вы можете проверить, реализует ли данный объект интерфейс (что означает, что он будет иметь метод onTouch). См. Вышеуказанный блок кода для такой реализации.
Как я могу вызвать метод
onTouch
из интерфейсаOnTouchListener
если я не знаю, какой класс его реализует?
Интерфейсы не вызывают методы. Как мне было описано, они заключают контракт между интерфейсом и разработчиком, который, независимо от того, какой объект реализует этот интерфейс, будет иметь следующие методы со следующими сигнатурами.
В MyClass
вы будете вызывать onTouch
же, как и любую другую функцию - передать в View
и MotionEvent
.
И как я могу узнать, какие классы реализуют этот интерфейс, если я решил отделить классы от интерфейса (разные библиотеки)?
Javadoc - ваш друг здесь (как разработчик). В качестве альтернативы, если вы делаете что-то в коллекции, например ArrayList
, Stack
, Queue
или что-то, что содержит Objects
, вы можете использовать следующий синтаксис, чтобы гарантировать, что независимо от того, какая коллекция вы используете, содержатся только объекты, которые реализовать свой интерфейс:
ArrayList<? extends View.OnTouchListener> myArrayList;
Любой класс, который реализует интерфейс, должен переопределять методы, изложенные в интерфейсе, поэтому вы можете легко успокоиться, когда узнаете, будет ли класс иметь реализацию для метода, который вы вызываете из объекта интерфейса.
Чтобы вызвать onTouch
из onTouchListener
вам просто нужно передать объект в ссылку типа onTouchListener
и перейти оттуда
onTouchListener myOnTouchListener = new MyClass();
myOnTouchListener.onTouch(arg0, arg1);
Для второй части вашего вопроса, я думаю, qaru.site/questions/32548/... должен быть вам полезен.