2010-02-21 13 views
18

En teoría de conjuntos, un conjunto es un superconjunto si contiene todo en el conjunto original y posiblemente más. Sin embargo, un subconjunto no contiene todo el conjunto inicial.¿Por qué se invierten la clase superior y la subclase?

Teniendo esto en cuenta, en la mayoría de los lenguajes de programación orientados a objetos (estoy pensando en Objective-C pero sé que lo mismo es cierto para Java y otros), la clase padre se llama super y cualquier clase hereda del super se llama subclass.

¿No es esto al revés? Una subclase hereda cosas como todas las variables de instancia y los métodos de su superclase, por lo que "contiene" todo desde el padre, más lo que se agrega en la subclase. ¿Es solo un error de denominación o fue intencional, y si es así, por qué?

+2

Siempre tengo que verificarme antes de decir uno u otro – pdr

Respuesta

21

Una superclase define una clase que tiene un mayor conjunto de valores posibles como miembros. Una subclase restringe los elementos que pueden ser parte de su clase, por lo que define un conjunto más pequeño de miembros posibles.

El conjunto de posibles miembros de una superclase es un superconjunto del conjunto de posibles miembros de una subclase de esa superclase.

+0

Pero el * set * de Parents (la superclase) es un * superconjunto * del conjunto de Children; el conjunto de Niños (la subclase) es un * subconjunto * del conjunto de Padres. "Miembros" se refiere al conjunto de objetos que son miembros del tipo, no al conjunto de variables miembro. – itowlson

+11

jbrennan: No debe pensar en una clase como un conjunto de sus propiedades. Deberías considerarlo como un conjunto de todas sus instancias posibles. Entonces tendrá sentido. Al igual que en matemáticas, Z es un superconjunto estricto de N, porque todos los números naturales son números enteros, pero no todos son números naturales. Object es la superclase de String en Java porque todas las cadenas son objetos, pero no todos los objetos son cadenas. – sepp2k

+1

@jbrennan: Estás pensando en * atributos * de clase, no posibles * valores * de ese tipo (en términos establecidos, miembros del conjunto de valores definidos por la clase). El conjunto de todos los valores posibles de 'Forma' contiene algunos valores que son círculos y algunos valores que son cuadrados, pero 'Círculo' y 'Cuadrado' podrían ser clases que tienen un conjunto de elementos mucho más pequeños que una 'Forma' general. (Recuerde que estoy usando el término "miembro" como "miembro del conjunto de valores" en lugar del término de programación "miembro de la clase"). –

1

Dejo de lado todo el asunto de la clase súper/secundaria y me refiero a ellos como clase "derivada" y "principal".

+0

esto podría ser el enfoque más práctico –

2

Probablemente por la misma razón que las pilas crecen (abajo en la parte superior), los árboles crecen hacia abajo (raíz en la parte superior) y los sistemas gráficos 2D son casi siempre cuadrantes IV (0,0 en la esquina superior izquierda).

+1

Así que la siguiente pregunta sería cuál es esa razón :-) – DerMike

6

Greg es correcto. Dos cosas a tener en cuenta que puede que sea más claro:

  1. los propertes y métodos no son relevantes para la relación de sub/súper en términos de la teoría de conjuntos:

    • las propiedades y métodos definidos por una subclase puede extenderse más allá de los proporcionados por su superclase (y de hecho, a menudo lo hacen), pero casos de la subclase son todavía miembros del conjunto de instancias de la superclase
    • en otras palabras, el/relación sub súper es no definido por las propiedades y los métodos, sino por la semántica a nivel de instancia destinados por la denominación de las clases
  2. Taxomony ejemplo:

    • el conjunto de todas las personas es más grande que el conjunto de todos los programadores
    • los Conjuntos de personas se de hecho, un superconjunto de los programadores conjunto
    • los programadores conjunto es un subconjunto del conjunto de personas

por lo tanto, en términos de OOP, las personas serían una superclase y el programador sería una subclase. Cada programador es una persona, pero no todas las personas son programadores. De ahí la superclase y la subclase. El hecho de que la clase del Programador pueda tener superpoderes más allá del conocimiento de los hombres mortales no cambia la semántica de la relación de clase (is-a).

1

La subclase tiene todos los [miembros] de su superclase [y más]. ¿No es esto al revés?

Este problema aparece en todos los lenguajes de programación, y siempre me duele la cabeza. (. Subtificación especialmente)

Estas son las reglas:

  • Cuando usted está considerando obejcts, la subclase/niño/subtipo tiene métodos más y miembros. Se puede usar en más contextos. Esto parece contradictorio.

  • Cuando está considerando contextos, interfaces o argumentos, los roles se invierten. Por ejemplo, un método que espera un argumento del supertipo/padre/superclase puede aceptar más argumentos que un método que espera un argumento del subtipo.

¿Cuál es en la parte superior depende enteramente de si usted piensa objetos son primarios o si usted piensa contextos esperando objetos son primarios. He estudiado este tema durante casi 15 años y todavía mi intuición me traiciona.

Si una declaración de clase se considera como una especificación , entonces la especificación superclase está satisfecha por más objetos, y la especificación subclase se satisface con menos objetos. Creo que este es el motivo de la nomenclatura. (Es un poco más claro si habla de subtipos y supertipos — un subtipo está habitado por menos valores que su supertipo, porque cada valor del subtipo también es un valor del supertipo, y el supertipo probablemente está habitado por valores adicionales que son no miembros del subtipo.)

¿Mencioné que todo el tema me hace doler la cabeza?

+0

C++: clase base, clase derivada, problema resuelto ;-) –

4

La respuesta de Greg es correcta. Aquí hay una explicación por ejemplo:

Tiene una base de clase base. Tienes dos clases derivadas DerivedA y DerivedB. Cada instancia de DerivedA es también una instancia de Base. Del mismo modo, cada DerivedB es también una base. Pero, un DerivedA es no un DerivedB y viceversa. Por lo tanto, si usted fuera a dibujar un diagrama de Venn del universo de todos los objetos posibles, se obtendría:

________________________ 
/      \ 
/  Base   \ 
/ ______  ______ \ 
| / \ / \ | 
| /  \ /  \ | 
| | DerivedA | | DerivedB | | 
| \  / \  / | 
| \______/  \______/ | 
\       /
    \      /
    \________________________/ 

En otras palabras, cada objeto en el conjunto de objetos DerivedA es también en el conjunto de Objetos base Del mismo modo para DerivedB. Así que Base es de hecho el superconjunto de DerivedA y DerivedB. Por lo tanto, es la "superclase".

+0

+1 Para este diagrama impresionante. – FluffyKittens

1

Sí, pero si piensas en tu diagrama como un mapa topográfico, las subclases tienen altitudes más altas que la superclase. De ahí la confusión.

Otra forma de ver esto es que la superclase es similar al dígito inicial de un número (para hacer de esto una analogía amigable con el lenguaje de programación, diremos un número de coma flotante).A medida que el número adquiere más dígitos, cada nuevo dígito "hereda" todos los dígitos que lo preceden. De forma similar, a medida que la subclase gane más métodos, heredará la lista de superclases, en el orden en que se nombraron, que la preceden.

Espero que esto ayude.

Cuestiones relacionadas