Cómo diseñar un método abstracto cuando no sabes el tipo de parámetros que contendrá (construyendo un Framework)
Frecuentes
Visto 136 veces
1
Estoy diseñando un marco para administrar ciertas llamadas de API y otras tareas de ejecución prolongada en nuestros clientes móviles. Lo diseñaré e implementaré en un programa Java básico que luego se puede pasar a los desarrolladores del cliente para ampliar las clases en el marco e implementar sus clases concretas donde hacen cosas específicas del contexto.
Hay un lugar donde el administrador enviaría notificaciones a los componentes que están esperando una tarea. Ahora en el AbstractManager
Tengo un método llamado registerClient(Messenger m)
donde un cliente puede registrarse como oyente para saber cuándo finaliza una tarea.
Ahora, si quiero mantenerlo abstracto, no puedo decir que es un Messenger
objeto, cada aplicación y plataforma puede usar una implementación diferente de notificación. ¿Cómo puedo diseñar esto para que registerClient
se puede implementar de alguna manera?
3 Respuestas
5
Podría proporcionar una interfaz (p. ej. IMessenger
) que cada objeto messenger debe implementar y hacer que el tipo del parámetro
registerClient(IMessenger m)
Si eligió los métodos correctos para la interfaz (principalmente los mismos que tiene para Messenger
ahora), puede proporcionar múltiples implementaciones de la interfaz que puede usar en el registerClient()
Método
Respondido el 12 de junio de 12 a las 16:06
3
Hágalo genérico para que su método sea registerClient(T messenger)
Respondido el 12 de junio de 12 a las 16:06
2
Al crear una API las interfaces y Genéricos son tus mejores amigos. Por supuesto, no sabe exactamente lo que sucederá, pero al proporcionar a los usuarios las interfaces que deben implementar, puede estar seguro de que puede hacer lo que necesita con las implementaciones concretas que decidan usar.
Respondido el 12 de junio de 12 a las 16:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java design-patterns frameworks or haz tu propia pregunta.
sí, pero esto puede ser difícil de hacer porque, por ejemplo, en Android, Messenger es una clase del sistema operativo y básicamente se genera a partir de una clase de controlador. Puede que no sea posible que el controlador implemente IMessenger. Tolga E.
Si no hay clases/interfaces base comunes para las clases de mensajería, entonces no podrá escribir su
registerClient
de forma genérica. Tal vez puedas usarHandler
¿en lugar de? No estoy familiarizado con los detalles de Android: AttilaSupongo que aquí es donde está el problema. Incluso solo en Android, para una aplicación, el cliente podría estar usando lo que se llama un
Broadcast
para enviar mensajes u otro podría usar unMessenger
.. Esto se vuelve aún más confuso cuando Blackberry está implementando el marco. Solo sé que recopilaremos algún tipo de objeto y llamaremos a una determinada función en ellos. ¿Quizás los genéricos podrían ser el camino a seguir para algo como esto? - Tolga E.Incluso para los genéricos, necesitaría algo en común entre las dos clases para hacer algo útil. Parece que necesitará crear dos tipos de administradores separados: uno para el registro/manejo de
Messenger
clientes y otra paraBroadcast
clientela. Alternativamente, proporcione dosregisterClient()
métodos para el mismoManager
: uno para registrarseMessenger
es el otro paraBroadcast
s, luego mantenga una colección separada de registradosMessenger
s y otra para registradosBroadcast
s - AttilaCreo que podría hacer una clase abstracta llamada
notifyClients
y dependerá de las abstracciones concretas descubrir cómo implementarlo (también realizar un seguimiento de los clientes, etc.) - Tolga E.