2016-12-20 1 views
2

Я недавно просматривал андроид документации SurfaceView и я обнаружил, что для получения фактической поверхности вы должны сделать следующее:Как именно абстрактный метод возвращает тип желания без переопределения?

SurfaceView.getHolder().getSurface() 

документация для держателя поверхности здесь: https://developer.android.com/reference/android/view/SurfaceHolder.html

сейчас SurfaceHolder возвращается из getHolder(), который затем вы можете вызвать getSurface() на этом держателе, чтобы получить поверхность. Теперь, если вы проверите метод getSurface(), вы увидите, что это абстрактный метод. Я думал, что абстрактный метод предназначен для переопределения, а затем он может вернуть тип желания.

Однако здесь приведена ссылка на интерфейс, который является SurfaceHolder, а затем вы вызываете getSurface(), который является абстрактным методом, который означает, что нет смысла, когда метод переопределяется. Так как именно код что проверка и возврат соответствующей поверхности вызывается из абстрактного метода?

ответ

2

Ваше понимание абстрактных методов является правильным.

Дело в том, что getHolder() возвращает бетон. Конкретный подкласс его абстрактной базы или, в вашем случае, конкретная реализация интерфейса. Функция объявляется как возвращающая базовый класс/интерфейс, но любой производный класс может быть возвращен в действительности. Это одна из основных форм полиморфизма:

Base getThing() { ... } 

может вернуть базу, или любые подклассы/реализации базы.

Дальнейшее чтение: https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html

Конкретные возвращаются к вам, вероятно, какая-то внутренняя непубличная вещи, кто знает (я не знаком с Android API сам), но это не имеет значения вы. Вам не нужно точно знать, что вам возвращается. Вам нужно только знать, что он реализует SurfaceHolder или что-то еще.

+0

О, ладно, я понял это сейчас, но то, что все еще касается меня, - это то, что именно является абстрактной базой, с которой реализуется surfaceHolder? Обычно, когда android расширяет интерфейс, он обычно сообщает вам в документации. Например, https://developer.android.com/reference/android/view/View.html. Поскольку вы видите, что представление реализует множественный интерфейс, оно является абстрактным. Поэтому я могу понять, рассматривается ли представление как интерфейс. – JustCurious

+0

@ JustCurious SurfaceHolder - это базовый интерфейс. Конкретная реализация, возвращаемая вам, вероятно, является некоторой внутренней непубличной вещью, которая знает. Но дело в том, что это не имеет значения для вас. Вам не нужно точно знать, что вам возвращается. Вам нужно только знать, что он реализует SurfaceHolder или что-то еще. Если вы действительно хотите узнать только, чтобы удовлетворить ваше внимание, вы можете использовать отражение для печати имени и иерархии классов, см. Https://docs.oracle.com/javase/tutorial/reflect/. –

0

Что фактически возвращается во время выполнения, является объектом, который реализует SurfaceHolder. Вам придется искать в других библиотеках времени выполнения, чтобы выяснить, какой тип конкретного объекта возвращается.