¿Cómo puedo obtener un valor de propiedad dentro de un método heredado en una clase genérica?

Estoy escribiendo un código como el siguiente y necesito obtener un valor de una clase secundaria a partir de un método estático de la clase principal.

¿Alguien puede ayudarme a resolverlo? Gracias de antemano.

public abstract class DataObject<T>{
    public static int GetAllTotal(){
        // How can I obtain a T propery called "code" = "001". 
        int cont = SQL.getTotalFromQuery(
                           "SELECT * from tblProducts where code = '001'"
        );
       return ffff
    }

    ...
}

public class Product extends DataObject<Product>{
    private String code = "001";
    public Product(){
    }
}

...

Product.GetAllTotal();

preguntado el 22 de mayo de 12 a las 17:05

Esto probablemente no debería ser estático, ya que no funcionará muy bien con la herencia. -

Por cierto, los nombres de los métodos de Java no deben escribirse en mayúscula. -

4 Respuestas

necesitas usar lo siguiente:

super.GetAllTotal();

En la clase infantil (derivada).

Dónde super es la referencia del padre de una clase derivada en Java.

contestado el 22 de mayo de 12 a las 17:05

¿Hay alguna forma de hacerlo sin crear un método en la clase secundaria? - user1410626

Sí, puedes llamar desde el constructor de la clase secundaria y asígnelo a un campo de clase para usarlo más adelante. - Cabeza de jengibre

¿Hay alguna forma de obtener una instancia de T dentro del método GetAllTotal? ¿Quizás Reflexión? - user1410626

En primer lugar, necesitará un objeto de la clase para poder acceder a los miembros dinámicamente desde un método estático.

Entonces podrías definir un público getCode() función en el padre que reemplaza en la clase secundaria que devuelve el valor de la code variable miembro.

contestado el 22 de mayo de 12 a las 17:05

¿Qué pasa con la reflexión en el método GetAllTotal? ¿Puedo saber que Product.GetAllTotal() proviene de la clase Product? Si es posible, ¿puedo crear una instancia de Producto? - user1410626

@ user1410626 - Es posible, pero es lento, feo y propenso a errores. Y debe restringir la visibilidad de GetAllTotal() a protected si puedes. En cuanto a la creación de la instancia usted mismo, es posible que no obtenga el valor de código que necesita. ¿Qué tal si vamos con la sugerencia en mi respuesta y agregamos un DataObject parámetro para GetAllTotal()? Tendrá que lidiar con las advertencias sobre llamadas no verificadas, pero parece el mal menor: Attila

@ user1410626 - también, debe GetAllTotal() ser estático? - Attila

Sí... "Necesito" que GetAllTotal sea estático. Quiero que todas las clases que son una herencia de DataObject tengan algún método estándar. Por ejemplo, Product tiene una propiedad que contiene el nombre de la tabla DDBB. Ese es el parámetro que necesito en GetAllTotal. ¿Funcionaría si esa propiedad es estática? - user1410626

Si hizo que la función no fuera estática y definió un getCode() (y cualquier otra cosa que necesites) en DataObject, luego anuló esa función en la clase secundaria, obtiene el comportamiento que desea sin los problemas que enfrenta al intentar usar una función estática. Los miembros estáticos están vinculados a la clase y no funcionan bien con la herencia: Attila

usa la palabra clave super para acceder a la referencia de la clase padre. En tu caso,

super.GetAllTotal();

contestado el 22 de mayo de 12 a las 17:05

¿No podemos parametrizar el método GetAllTotal para aceptar un argumento, o hay alguna restricción para cambiar la definición del método?

GetAllTotal(String code)

contestado el 22 de mayo de 12 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.