2010-02-16 13 views
7

Considera una situazione da club sportivo. Un club può avere un manager di club e uno o più allenatori (1 pullman per squadra) Quindi, ecco un esempio delle classi Manager e Coach.Creazione di un oggetto che ha tutte le proprietà di altri due oggetti?

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

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

Il mio problema è, come posso avere un manager di club che è anche un allenatore? perché ci sono club sportivi con questa situazione.

Apprezzare qualsiasi aiuto. Grazie ragazzi.

+2

Sembra che si desideri ereditarietà multipla, che non è supportata in C#. –

risposta

1

Ereditarietà multipla è ciò che stai cercando. Sfortunatamente, questo non è attualmente supportato in C#. Non l'ho visto nemmeno nella versione 2010.

È possibile implementare interfacce multiple, ma non si può ereditare da più classi.

+6

Non è qualcosa che è probabile che venga aggiunto a C# a causa di tutte le insidie ​​che crea. http://en.wikipedia.org/wiki/Multiple_inheritance#Criticisms –

0

Ecco la prima idea che mi è venuta in mente:

  1. creare una classe ClubManagerCoach, o qualcosa in tal senso che ha la logica sia per dirigenti e allenatori.
  2. Creare interfacce per IClubManager e ICoach. Usa queste interfacce al posto di ClubManager e Coach.
  3. Fare ClubManagerCoach implementare IClubManager e ICoach.
8

No, non è possibile farlo con le classi. Le interfacce ti portano in quella direzione.

D'altra parte, è possibile aggiungere un altro livello di riferimento indiretto e separare i ruoli di manager e allenatore da persone, in modo che sia possibile assegnare ciascun ruolo a una persona (che potrebbe anche essere la stessa persona).

+3

+1 Questa è la soluzione corretta; Coach e Manager sono RUOLI che le persone giocano, non tipi di persone. Maggiori dettagli di seguito. –

1

Come ha osservato Chinmay Kanchi, C# non supporta l'ereditarietà multipla; tuttavia, puoi ereditare da un tipo e implementare tutte le interfacce che desideri.

public interface ICoach { 
} 

public class ClubManager : SomeType, ICoach { 
} 
0

Penso che il miglior compromesso si otterrà in questo caso (e questo è un argomento dibattuto, ovviamente) è quello di creare qualcosa lungo le linee di una classe ClubManagerCoach che espone ClubManager e Coach proprietà.

1

si può fare questo, ma con procedura riportata di seguito come C# non supporta l'ereditarietà tra le classi

Interface IClubManager 
{ 
    public void RegisterMember();   
} 

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

Come altri hanno notato, non è possibile farlo con le classi, anche se è possibile farlo con interfacce, che ha lo svantaggio di reimplementare l'interfaccia ogni volta. Un modo per aggirare questo è con i mixin: Is it possible to implement mixins in C#?.

1

Non è possibile avere esattamente ciò che si desidera: l'ereditarietà multipla non è supportata in C#.

Insieme alle altre proposte sull'utilizzo delle interfacce (con i loro limiti), è possibile ripensare il modello di oggetto.

Se si separa la struttura dati (classi), quindi la classe Coach e la classe ClubManager ha una proprietà Person, non si "duplicano" i dati della persona. E puoi avere metodi di fabbrica per creare Coach fuori di persona e/o ClubManager di persona.

Un'altra opzione sarebbe avere la funzionalità "InRole", che indica quale ruolo può avere una persona, e la classe Persona avrà entrambi i metodi richiesti, ma ognuno di essi può generare un'eccezione se la persona non è in il ruolo giusto per eseguire l'operazione.

Oppure, è possibile iniettare "ruoli" e utilizzare una qualche forma di riferimento indiretto per accedere alle funzionalità del ruolo specifico.

2

Essere un allenatore e essere un ClubManager non sono attributi intrinseci di questa persona. Sono ruoli che la persona ha assunto. In quanto tale, direi che l'oggetto persona (o qualunque cosa tu voglia chiamarlo) dovrebbe essere assegnato ai ruoli. Questi oggetti di ruolo/abilità delegherebbero quindi quei metodi.

Quindi potrebbe assomigliare a questo:

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

joe.getManagerAbilities().RegisterMember(); 

difficile sapere ciò che è giusto, senza molte più informazioni sul problema, ma forse questo ti porterà a pensare lungo alcuni linea diversa.

+0

Il tuo suggerimento ha senso logico, ma io sono molto nuovo a questo concetto di ruoli e questa tecnica, cioè non l'ho mai usato nella mia vita. Sei in grado di darmi qualche suggerimento su dove iniziare a capire come usare questa tecnica per risolvere il problema? – fred

+0

Sì ... è qualcosa che ho tirato fuori dal mio culo. Fondamentalmente pensavo ai mix-in di Ruby e la composizione come Robert Davis menziona qui. I ruoli/abilità sono sembrati un buon modo per dividere il tuo problema e simulare il nostro modo di mix-in. Fondamentalmente il mio pensiero era che le persone nel tuo sistema non fossero "allenatori". Sono persone che a volte hanno responsabilità di coaching (cioè potrebbero non essere un allenatore in futuro, quindi devi creare un oggetto completamente nuovo). Da ciò sembra logico che queste persone abbiano qualche attributo che li rende un allenatore. –

+0

continua ... Quindi da lì abbiamo un paio di opzioni: 1) creare nuovi oggetti che contengono una persona come Steven A. Lowe menziona o 2) creare nuovi oggetti di ruolo/abilità/responsabilità che sono attributi della persona. Il secondo sembrava imitare la realtà un po 'più da vicino, quindi sono andato con quello. –

3

Il secondo paragrafo di Lucero è l'approccio corretto. Coach e Manager non sono tipi di persone, sono ruoli che giocano le persone. Teoricamente la stessa persona potrebbe essere un TeamPlayer, TeamCaptain, Coach, Manager e WaterBoy!

Quindi quello che vuoi è la composizione, non l'ereditarietà. Ad esempio:

SportsClub myClub = new SportsClub(); 
Person Bill = new Person(); 
myClub.Manager = new Manager(Bill); 
myClub.Coach = new Coach(Bill); 
Problemi correlati