Así es como puedo razón de ello:
Utilice sólo la herencia si el papel/Tipo nunca va a cambiar. p.
utilizando la herencia para cosas como:
bombero < - Empleado < - persona está equivocada.
tan pronto como Freddy el bombero cambie de trabajo o quede desempleado, tienes que matarlo y recrear un nuevo objeto del nuevo tipo con todas las relaciones antiguas asociadas.
Por lo tanto, la solución ingenua al problema anterior sería otorgarle una propiedad JobTitle enum a la clase de persona. Esto puede ser suficiente en algunos escenarios, p. si no necesita comportamientos muy complejos asociados con el rol/tipo.
La forma más correcta sería darle a la persona una lista de roles. Cada función representa, por ejemplo, un empleo con un lapso de tiempo.
p. Ej.
freddy.Roles.Add(new Employement(employmentDate, jobTitle));
o si eso es una exageración:
freddy.CurrentEmployment = new Employement(employmentDate, jobTitle);
De esta manera, Freddy puede convertirse en un desarrollador w/o que tener que matarlo primero.
Sin embargo, todas mis divagaciones aún no han respondido si debe usar una enumeración o jerarquía de tipos para el título de la tarea.
En pure in mem OO Diría que es más correcto usar herencia para los títulos de trabajo aquí.
Pero si está haciendo un mapeo O/R, puede terminar con un modelo de datos supercomplejo entre bastidores si el asignador intenta asignar cada subtipo a una nueva tabla. Entonces, en tales casos, a menudo prefiero el enfoque enum si no existe un comportamiento real/complejo asociado con los tipos. Puedo vivir con un "tipo si == JobTitles.Fireman ..." si el uso es limitado y hace las cosas más fáciles o menos complejas.
p. Ej. el diseñador de Entity Framework 4 para .NET solo puede asignar cada subtipo a una nueva tabla. y es posible que obtenga un modelo feo o una gran cantidad de combinaciones cuando consulte su base de datos sin ningún beneficio real.
Sin embargo, sí uso la herencia si el tipo/rol es estático. p. para Productos.
es posible que tenga CD < - Producto y libro < - Producto. La herencia gana aquí porque en este caso es muy probable que tenga un estado diferente asociado con los tipos. El CD puede tener varias pistas de propiedad, mientras que un libro puede tener varias páginas de propiedad.
Así que en resumen, que depende ;-)
Además, al final del día, lo más probable es terminar con una gran cantidad de sentencias switch de cualquier manera. Digamos que desea editar un "producto", incluso si se utiliza la herencia, es probable que tenga un código como éste:
si (el producto es libro) Response.Redicted ("? ~/EditBook.aspx id" + producto.id);
Debido a que codifica la URL de edición de libros en la clase de entidad sería feo llano, ya que obligaría a sus negocios ENTIDADES saber sobre la estructura del sitio, etc.
¿Es esto para un modelo de objeto en memoria o un ORM? No creo que el ejemplo de Animals sea muy útil, ya que no ejerce muchos de los problemas comunes que enfrenta al hacer un diseño de OO real. –
@Marcelo: de acuerdo. Específicamente, ¿cuál es el ángulo de comportamiento? – sfinnie
Los perros ladran, los gatos merodean, usando la implementación de su colega, estos comportamientos serán difíciles de implementar en C# (por ejemplo). Todavía es útil en lenguajes funcionales como F # donde las uniones discriminadas son un medio muy poderoso para proporcionar polimorfismo. –