Este es un ejemplo interesante de polimorfismo.
Mientras su base
extiende Context
, tiene que proporcionar una implementación de getApplicationContext()
, que en el caso de ContextWrapper
es el código que ya ha proporcionado aquí. Existe esta implementación, y the one in ContextImpl
.
Es importante tener en cuenta un par de cosas al leer el código que ya ha proporcionado: ContextWrapper
sí se extiende Context
, pero también tiene un Context
como una entrada (que podría ser un ContextWrapper
, o una Service
, o un Application
, o un Activity
). ContextWrapper
no importa qué tipo es; simplemente sabe que tienen un método getApplicationContext
y desea llamar a ese método cuando se le solicite. (Por ejemplo, se podría pasar otra ContextWrapper
, pero debido a que dicho ContextWrapper
también requeriría un Context
en su constructor, que acaba de añadir otro nivel de anidamiento.)
La clase Application extends ContextWrapper
llama super(null)
, lo que significaría que getApplicationContext()
haría arroje un NullPointerException
si se dejó de esa manera, sin embargo, en ContextWrapper
también es configurable por attachBaseContext(Context)
, y aquí es donde se pone interesante.
Ambos Activity
y Application
tienen los métodos attach(Context [...other stuff])
. Cada uno de ellos llama al attachBaseContext()
con el Context
pasado.
- En la clase
Instrumentation
, encontrará android.app.Instrumentation.newApplication()
, donde se crea un ContextImpl
, y pasa a un Application
.
- En la clase
ActivityThread
, encontrará handleBindApplication
que crea un ContextImpl
que se pasa al Activity
como su raíz Context
.
- En la clase
LoadedApk
, encontrará makeApplication
que crea un ContextImpl
que se pasa a Application
. Here son los lugares a los que se llama.
Así, al final del día, mBase
normalmente termina como un ContextImpl
.
enlaces potencialmente útil Me miraron al mismo tiempo encontrar todo esto a cabo:
¿Entiende la forma abstracta funcionan las clases? Hay alguna clase concreta en alguna parte que 'extiende Context', y ahí es donde se implementa el método. –
Me interesa saber dónde está, entiendo cómo funcionan las clases abstractas. – Eugene