Cómo diseñar un método abstracto cuando no sabes el tipo de parámetros que contendrá (construyendo un Framework)

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?

preguntado el 12 de junio de 12 a las 16:06

3 Respuestas

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

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 usar Handler ¿en lugar de? No estoy familiarizado con los detalles de Android: Attila

Supongo 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 un Messenger.. 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 para Broadcast clientela. Alternativamente, proporcione dos registerClient() métodos para el mismo Manager: uno para registrarse Messengeres el otro para Broadcasts, luego mantenga una colección separada de registrados Messengers y otra para registrados Broadcasts - Attila

Creo 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.

Hágalo genérico para que su método sea registerClient(T messenger)

Respondido el 12 de junio de 12 a las 16:06

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 or haz tu propia pregunta.