2010-06-24 10 views
5

debo estructurar nuevo modelo para la aplicación y no lo que es mejor:herencia o enumeración

utilizando la herencia o el uso de enumeración como tipo de objeto:

Por ejemplo:

Libros

class Book 
{ 
public string Name {get;set;} 

public string Author {get;set;} 

public int NumberOfPages {get;set;} 

} 

public class Encyclopedie:Book 
{ 

} 

public class Novel:Book 
{ 

} 

o un mejor uso:

class Book 
{ 

public BookType Type {get;set;} 

public string Name {get;set;} 

public string Author {get;set;} 

public int NumberOfPages {get;set;} 

} 

public enum BookType 
{ 
Encyclopedie = 0, 
Novel = 1, 
... 
} 

Respuesta

21

Use la herencia si los diferentes tipos tienen diferencias significativas (cómo los procesa y los trata). Es decir, si vas a usar polimorfismo en absoluto, debes usar la herencia.

Si solo necesita una forma de distinguir diferentes tipos de libros, vaya con Enum.

+0

Absolutamente de acuerdo. Estaba pensando en cómo expresar "diferencias significativas" justo ahora. Pobre inglés :( –

+1

de acuerdo. Parece que solo quiere verlo como diferentes tipos. La herencia hace un fuerte acoplamiento, ¿y qué pasa cuando tienes un libro que cruza géneros? ¿Cambiar a C++ para permitir herencia múltiple? A [Flag] 'ed enum podría ser una buena opción aquí. – simendsjo

+0

+1 para una respuesta muy clara. La única respuesta correcta en mi humilde opinión – pyrocumulus

0

Realmente depende. La primera solución es mejor si necesita usar polimorfismo. Desde mi opinión personal, prefiero usar herencia.

2

Yo diría que el 2do sería mejor ya que no está realmente extendiendo la clase de libro en su Enciclopedia, no hay propiedades adicionales o funcionalidad que necesite para dar un tipo de libro sobre otro.

2

"mejor" es subjetivo y depende en gran medida del propósito de la clase/modelo. ¿Cuál es tu objetivo? ¿Qué quieres lograr?

En este momento, puedo decir que la herencia es útil cuando la clase derivada tiene algunas propiedades bastante únicas, como Encyclopédie tiene propiedades que explican qué tipo de Encyclopédie es en realidad y esas propiedades no pertenecen, de ninguna manera, a una novela.

0

Si los diferentes tipos de libros tendrán diferentes atributos, definitivamente debe usar un modelo de herencia. Esto también permite el polimorfismo, que generalmente es mejor

Si todos tienen los mismos atributos, es mejor que vaya con la enumeración. Pero todo depende de la aplicación.

-1

usando un enum para "escribir" su objeto suena un poco al estilo "viejo C" de programación.

Es decir, está bien, pero cuando la herencia está disponible (está usando C#) generalmente es una mejor opción. Una enumeración generalmente presenta algunos "problemas", por ejemplo, al serializar/deserializar datos: ¿qué sucede si una versión anterior de su aplicación utiliza un escenario "más reciente" en el que un BookType tiene un elemento desconocido? (compatibilidad hacia atrás/adelante podría ser un requisito para su aplicación)

Por supuesto, puede manejar esto con un bounch de "if-then-else", pero la herencia parece una opción más limpia en mi punto de vista.

¡Adiós!

+0

¿Cómo distinguirías entre clases heredadas al deserializar datos? La única forma que veo es incluir el nombre de clase con cada instancia de objeto serializado (que también puede hacer llamando a tosting() en una enumeración) – apoorv020

+0

Un XmlSerializer devuelve datos escritos - seguro de que puede usar una enumeración y encenderla, pero ¿por qué hacer eso cuando el "tipo" ya ofrece lo mismo? Además, si solo usa una sola clase y una "enumeración" para escribirla, tendrá que poner * todas * las propiedades necesarias para los diversos tipos de ese clas s. Probablemente tendrá una propiedad "XYZ" necesaria por tipo "BookAAA" pero no por tipo "NovelBBB" - y esto no es tan bueno, en mi humilde opinión, cuando puede evitar esto por herencia. –

0

Creo que deberías tomar esta decisión según el "propósito" del libro. Si los libros no necesitan ningún material adicional (métodos y propiedades ...) enum debería ser suficiente. Si tiene que crear un comportamiento común para cada libro y algo más específico para cada tipo de libro, obviamente necesita heredar (clase abstracta "libro" y clases concretas).

3

En sistemas orientados a objetos verdaderos, el tipo de objeto es transparente para el cliente.Por lo tanto, el código que maneja los libros no debe saber cuál es el tipo de libro, sino solo invocar los métodos en los libros.

Así que si necesita implementar un comportamiento diferente dentro del libro en respuesta a la invocación del método, extienda el Libro y anule algunos de sus métodos. Si no lo haces, entonces no lo hagas.

Parece, dado el cuerpo vacío de sus subclases, que se comportan de la misma manera que los libros. Así que simplemente está etiquetando el libro con algunos datos adicionales: la diferencia entre Encyclopaedia y Novel no es más esencial para el libro que el tapa dura o softback o impresión grande o estándar: un cliente puede usarlos de manera diferente, y cada libro es grande. imprimir libro o es un libro impreso estándar, pero estos son todos los atributos del libro en lugar de diferencias esenciales.

No necesitaría usar una enumeración para el tipo de libro, ya que es posible que desee agregar más datos - Usaría un sistema de etiquetado libre, para que pueda etiquetar un libro con una colección de tipos - para que pueda tendría un libro etiquetado como {'niños', 'ornitológico', 'enciclopedia',} - o permitir la estructura en los roles - por lo que hay un papel para 'enciclopedia ornitológica infantil' creado cuando se requiere, pero no hay una enumeración fija.

Cuestiones relacionadas