2009-07-08 18 views
5

Supongamos que estamos creando un control genérico en .NET. P.ej. un árbol. No entiendo por qué las personas usan este tipo de definición genéricaTipos genéricos vs Clase abstracta/Interfaces

Control<T> 

cuando en la Programación Orientada a Objetos puedo utilizar una clase abstracta o una interfaz:

Control<IItem> or Control<BaseClass> 

Así que lo único que hay que hacer es , sus tipos deben derivarse de esa clase base o implementar la interfaz . ¿Significa que los tipos genéricos son más convenientes porque no tengo que implementar ni heredar nada?

Respuesta

16

Creo que está un poco confundido. Los tipos genéricos y las clases/interfaces abstractas sirven para diferentes objetivos para diferentes enfoques en el diseño de aplicaciones. Las clases/interfaces abstractas son para la generalización de la funcionalidad común de un grupo de entidades. Más adelante, esta API podría implementarse de manera diferente, pero dado que el polimorfismo está involucrado, no afectará a nadie.

Por otro lado, a veces tiene una implementación muy similar de algo y la única diferencia es el tipo de objetos con los que está trabajando. Aquí necesitarás un genérico. Podría usar polimorfismo, pero no es necesario. Para ese propósito, es mucho más claro definir una interfaz, realizar una implementación y dejar que el usuario final decida qué tipo de objeto usar.

El mejor ejemplo es List, donde el propósito principal de la lista es almacenar elementos. Al implementador de la Lista no le debe importar qué tipo de objetos va a utilizar, de modo que más adelante podrá simplemente definir la Lista y hacer uso de la lista entera.

+0

OK ahora entiendo la diferencia, muchas gracias. –

+0

Me alegro, lo dejé un poco claro para ti. –

3

Porque en su caso de un control de árbol, la definición de un control de árbol genérico significaría que los elementos de árbol pueden ser de cualquier tipo (también puede agregar ciertas restricciones).

Cuando una instancia de un control, por supuesto, tendría que declarar el tipo de elemento (como en los ejemplos segundo código con IItem y BaseClass).

Si su control Tree no sería un tipo genérico, tendría que crear varios controles para cada tipo de elemento.

¿Por qué no usar interface/abstractBase type?
Si solo utilizara una interfaz/resumen como su clase concreta de Artículo, estaría limitado por su definición. Solo verías sus propiedades y métodos. Con el control Tree genérico y cualquier tipo de elemento, aún puede acceder a todas las propiedades y métodos independientemente de la implementación de su interfaz o de la herencia de clase principal ...

+0

Sí, gracias, eso es lo que quería escuchar. –

+0

Pero tengo 1 pregunta más, ¿qué pasa si quiero restringir el tipo T para tener propiedades de padres e hijos y no uso una interfaz. ¿Es posible? –

+0

@stefan - las restricciones deben expresarse a través de interfaces, aparte de algunas cosas simples: es un tipo de valor ('donde T: struct'), o un tipo de referencia (' donde T: clase'), o que tiene un constructor predeterminado ('donde T: new()') –