Ángela, miembro de este gran staff, nos hizo el favor de escribir este artículo ya que domina muy bien este tema.
Solución:
En Java, la creación de subclases es una especie de subtipificación.
Hay varias formas en que Java permite la subtipificación:
- Cuándo
class A extends B
,A
es un subtipo deB
porqueB b = new A(...);
está bien - Cuándo
interface A extends B
,A
es un subtipo deB
porqueB b = new A() ...
está bien - Cuándo
class A extends B
,A[]
es un subtipo deB[]
porqueB[] b = new A[0]
está bien - Cuándo
class A implements B
,A
es un subtipo deB
porqueB b = new A(...)
está bien
Parece que quieres una manera de distinguir uno de los otros. Lo siguiente debería hacer eso.
static boolean isSubclass(Class> a, Class> b)
return !b.isArray() && !b.isInterface() && b.isAssignableFrom(a);
Sin embargo, no manejará la creación de subtipos de clases genéricas debido al borrado de tipo. Class
las instancias no llevan parámetros de tipo en tiempo de ejecución, por lo que no hay forma de distinguir el tipo de tiempo de ejecución de un new ArrayList
a partir de una new ArrayList
.
Subclase no es lo mismo que subtipo. Puede crear subclases que no sean subtipos. Para entender qué es un subtipo, comencemos dando una explicación de qué es un tipo.
Cuando decimos que el número 5 es de tipo entero, estamos afirmando que 5 pertenece a un conjunto de valores posibles (como ejemplo, ver los valores posibles para los tipos primitivos de Java). También estamos afirmando que hay un conjunto válido de métodos que puedo realizar en el valor como la suma y la resta. Y finalmente estamos afirmando que hay un conjunto de propiedades que siempre se cumplen, por ejemplo, si sumo los valores 3 y 5, obtendré como resultado 8.
Para dar otro ejemplo, piense en los tipos de datos abstractos, conjunto de enteros y lista de enteros, los valores que pueden contener están restringidos a números enteros. Ambos admiten un conjunto de métodos, como agregar (nuevo valor) y Talla(). Y ambos tienen diferentes propiedades (clase invariante), Conjuntos no permite duplicados mientras Lista permite duplicados (por supuesto, hay otras propiedades que ambos satisfacen).
El subtipo también es un tipo, que tiene una relación con otro tipo, llamado tipo principal (o supertipo). El subtipo debe satisfacer las características (valores, métodos y propiedades) del tipo padre. La relación significa que en cualquier contexto donde se espera el supertipo, puede ser sustituible por un subtipo, sin afectar la conducta de la ejecución. Vamos a ver algo de código para ejemplificar lo que digo. Supongamos que escribo un lista de enteros (en una especie de pseudolenguaje):
class List
data = new Array();
Integer size()
return data.length;
add(Integer anInteger)
data[data.length] = anInteger;
Luego, escribo el conjunto de enteros como una subclase de la lista de enteros:
class Set, inheriting from: List
add(Integer anInteger)
if (data.notContains(anInteger))
super.add(anInteger);
Nuestro conjunto de enteros clase es una subclase de Lista de enteros, pero no es un subtipodebido a que no cumple con todas las características del Lista clase. Los valores y la firma de los métodos se cumplen, pero las propiedades no. el comportamiento de los agregar (entero) El método se ha cambiado claramente, sin conservar las propiedades del tipo principal. Piensa desde el punto de vista del cliente de tus clases. Podrían recibir un conjunto de enteros donde un lista de enteros se espera. El cliente podría querer agregar un valor y obtener ese valor agregado al Lista incluso si ese valor ya existe en el Lista. Pero ella no obtendrá ese comportamiento si el valor existe. ¡Una gran sorpresa para ella!
Este es un ejemplo clásico de un uso indebido de la herencia. Utilice la composición en este caso.
(un fragmento de: use la herencia correctamente).
Por una vez, Wikipedia da una respuesta muy directa a la pregunta:
http://en.wikipedia.org/wiki/Subtype_polymorphism
La subtipificación no debe confundirse con la noción de herencia (clase u objeto) de los lenguajes orientados a objetos; la subtipificación es una relación entre tipos (interfaces en el lenguaje orientado a objetos) mientras que la herencia es una relación entre implementaciones derivadas de una característica del lenguaje que permite crear nuevos objetos a partir de los existentes. En varios lenguajes orientados a objetos, la subtipificación se denomina herencia de interfaz.
En resumen, la creación de subtipos se produce cuando se deriva una interfaz (firmas de métodos/puntos de acceso/formas de reaccionar ante el mundo exterior) de otra, mientras que la subclasificación se produce cuando se deriva una implementación (métodos, attributes/estado interno y lógica interna) de una clase de otra clase a través de la herencia.
Esta terminología no se usa a menudo de esta manera y el tipo generalmente se refiere al tipo de datos.
Comentarios y puntuaciones del tutorial
Al final de la artículo puedes encontrar las referencias de otros creadores, tú también tienes el poder insertar el tuyo si lo deseas.