Recuperar la clase a la que pertenece un objeto en Java y C#

Una acción bastante común en programación orientada a objetos es poder conocer si un objeto pertenece a una clase concreta. Se suele usar al reimplementar métodos para agregar funcionalidad a la ya existente usando herencia.

En este artículo se verá cómo conocer si un objeto pertenece a una clase concreta usando Java y C#. Para el ejemplo se usará una clase que se podrá comparar con otra.

Supongamos que tenemos una clase Persona con los siguientes parámetros:

  • DNI
  • Nombre
  • Apellidos

El objetivo es conseguir implementar la funcionalidad necesaria para poder comparar personas por DNI.

Implementación en Java

En Java, el código a escribir sería el siguiente:

public class Persona {

    private String DNI;
    private String Nombre;
    private String Apellidos;

    public String getDNI()
    {
        return DNI;
    }

    @Override
    public boolean equals(Object o) {
        if(o instanceof Persona && ((Persona)o).getDNI().equals(getDNI()))
            return true;
        return false;
    }
}

Las primeras líneas contienen la definición de la clase, los tres valores usados y el método getDNI para poder acceder al valor DNI, que será solo lectura.

Para comparar lo que se ha hecho es reemplazar (override) el método equals, que se hereda de la clase Object y de la que heredan todas las clases en Java. Esta comparación primeramente comprueba que el objeto sea de tipo Persona, y si el DNI coincide, en caso contrario devuelve false. Si no se hubiese hecho este reemplazo, se llamaría al método existente en la clase Object que se limita a comparar la dirección de memoria del objeto.

Implementación en C#

C# y Java son dos lenguajes de programación que comparten bastantes elementos en su sintaxis, y en este caso tampoco existe una gran diferencia. La definición de la clase en C# sería la siguiente:

    public class Persona
    {
        private string dni;
        private string nombre;
        private string apellidos;

        public string DNI
        {
            get { return dni; }
            set { dni = value; }
        }

        public override bool Equals(object obj)
        {
            if (obj.GetType() == typeof(Persona))
            {
                if ((obj as Persona).DNI == DNI)
                {
                    return true;
                }
            }
            return false;
        }
    }

Como se aprecia, el código es bastante similar. El acceso a las variables en C# se produce mediante el uso de Propiedades que se emplean de manera similar a las funciones que se han visto anteriormente en Java.

Para poder obtener la clase a la que pertenece el objeto del objeto, se obtiene el tipo con la sentencia getType, que devuelve un AssemblyQualifiedName, un nombre de tipo completo que incluye tipos anidados, el nombre de ensamblado y argumentos de tipo genérico.

Por ejemplo, el nombre completo de una clase podría ser similar al siguiente:

TopNamespace.SubNameSpace.ContainingClass+NestedClass,MyAssembly

Este nombre se compara con el que devuelve el operador typeof, lo que permite saber el nombre completo de la clase.

Resumen

En este artículo se ha visto cómo se puede obtener el tipo al que pertenece un objeto usando C# y Java, así como un escenario concreto en el cual puede resultar de gran utilidad.

Más información