2010-02-16 100 views
7

Considera una situación de club deportivo. Un club puede tener un gerente del club y 1 o más entrenadores (1 entrenador por equipo) Por lo tanto, aquí hay un ejemplo de las clases de Manager y Coach.¿Creando un objeto que tenga todas las propiedades de otros dos objetos?

Class ClubManager 
{ 
    public void RegisterMember() 
    { 
     // code for registering a member.. 
    } 
} 

Class Coach 
{ 
    public void DeviceTeamFormation() 
    { 
     // code for making a team formation.. 
    } 
} 

Mi problema es, ¿cómo puedo tener un gerente de club que también sea entrenador? porque hay clubes deportivos con esta situación.

Apreciar toda la ayuda. Gracias chicos.

+2

Parece que quiere una herencia múltiple, que no se admite en C#. –

Respuesta

1

Herencia múltiple es lo que estás buscando. Desafortunadamente, esto no es actualmente compatible con C#. Tampoco lo vi aparecer en la versión de 2010.

Puede implementar múltiples interfaces de, pero no puede heredar de múltiples clases.

+6

No es algo que sea probable que se agregue a C# debido a todas las trampas que crea. http://en.wikipedia.org/wiki/Multiple_inheritance#Criticisms –

0

Aquí es la primera idea que me vino a la cabeza:

  1. crear una clase ClubManagerCoach, o algo por el estilo que tiene la lógica de los directivos y entrenadores.
  2. Crear interfaces para IClubManager e ICoach. Use esas interfaces en lugar de ClubManager y Coach.
  3. Haga que ClubManagerCoach implemente IClubManager e ICoach.
8

No, no puede hacer esto con las clases. Sin embargo, las interfaces te llevan en esa dirección.

Por otro lado, es posible que desee agregar otro nivel de direccionamiento indirecto y separar las funciones de gerente y coach de las personas, para que pueda asignar cada rol a una persona (que también puede ser la misma persona).

+3

+1 Esta es la solución correcta; El entrenador y el gerente son ROLES que la gente juega, no tipos de personas. Más detalles a continuación. –

1

Como observó Chinmay Kanchi, C# no es compatible con herencia múltiple; sin embargo, puede heredar de un tipo e implementar tantas interfaces como desee.

public interface ICoach { 
} 

public class ClubManager : SomeType, ICoach { 
} 
0

creo que el mejor compromiso que obtendrá en este caso (y esto es un tema debatido, por supuesto) es crear algo en la línea de una clase ClubManagerCoach que expone ClubManager y Coach propiedades.

1

se puede hacer esto, pero con la siguiente procedimiento como C# no soporta la herencia a través de clases

Interface IClubManager 
{ 
    public void RegisterMember();   
} 

Interface ICoach 
{ 
    // code for making a team formation.. 
} 
class SomeDesignation : ICoach, IClubManager 
{ 
} 
1

Como otros han señalado, no se puede hacer eso con las clases, aunque puede hacerlo con interfaces, lo que tiene la desventaja de que ha vuelto a implementar la interfaz cada vez. Una forma de evitarlo es con mixins: Is it possible to implement mixins in C#?.

1

No puede tener exactamente lo que desea; la herencia múltiple no es compatible con C#.

Junto con otras propuestas sobre el uso de interfaces (con sus limitaciones), posiblemente pueda volver a pensar en el modelo de objetos.

Si separa su estructura de datos (clases), para que la clase Coach y la clase ClubManager tengan la propiedad Person, no "duplicarán" los datos de la persona. Y puede tener métodos de fábrica para crear Coach de persona, y/o ClubManager de persona a persona.

Otra opción sería tener la funcionalidad "InRole", que dice qué rol puede tener una persona, y la clase Person tendrá los dos métodos que necesita, pero cada uno de ellos puede lanzar una excepción si la persona no está el rol correcto para realizar la operación.

O bien, puede insertar "roles" y usar alguna forma de direccionamiento indirecto para acceder a la funcionalidad del rol específico.

2

Ser un Entrenador y ser un Administrador del Club no son atributos inherentes de esta persona. Son roles que la persona ha asumido. Como tal, diría que a la persona objeto (o lo que sea que quiera llamarlo) se le deben asignar roles. Esos objetos role/ability delegarían esos métodos.

lo tanto, podría tener este aspecto:

Person joe = new Person("joe"); 
joe.setClubManager(true); 

joe.getManagerAbilities().RegisterMember(); 

difícil saber lo que es correcto y sin mucha más información acerca de su problema, pero tal vez esto te hará pensar a lo largo de cierta línea diferente.

+0

Su sugerencia tiene sentido lógico, pero soy muy nuevo en este concepto de roles y esta técnica, es decir, nunca la he usado en mi vida. ¿Puede darme algunas sugerencias sobre por dónde empezar para comprender cómo usar esta técnica para resolver el problema? Aprecielo, ty. – fred

+0

Sí ... es como algo que saqué de mi culo. Básicamente estaba pensando en mix-in's de Ruby y composición como Robert Davis menciona aquí. Roles/habilidades parecían una buena manera de dividir tu problema y fingir nuestro camino a las mezclas. Básicamente mi proceso de pensamiento fue que las personas en su sistema no son 'entrenadores'. Son personas que a veces tienen responsabilidades de coaching (es decir, pueden no ser entrenadores en el futuro, luego tienes que crear un objeto completamente nuevo). De eso parece lógico que estas personas tengan algún atributo que los haga un entrenador. –

+0

continuación ... Así que a partir de ahí tenemos un par de opciones: 1) hacer nuevos objetos que contengan una persona como Steven A. Lowe menciona o 2) crear nuevos objetos de rol/habilidad/responsabilidad que sean atributos de la persona. El segundo parecía imitar la realidad un poco más de cerca, así que fui con ese. –

3

El segundo párrafo de Lucero es el enfoque correcto. El entrenador y el gerente no son tipos de personas, son roles que las personas juegan. Teóricamente, la misma persona podría ser TeamPlayer, TeamCaptain, Coach, Manager y WaterBoy.

Así que lo que quieres es composición, no herencia. Por ejemplo:

SportsClub myClub = new SportsClub(); 
Person Bill = new Person(); 
myClub.Manager = new Manager(Bill); 
myClub.Coach = new Coach(Bill); 
Cuestiones relacionadas