Come creo un singolo oggetto che cambia funzionalità in base all'input del programmatore?

0

Ho diverse classi che si comportano tutte in base a un'interfaccia. Ma in ogni classe ci sono funzioni aggiuntive definite che danno ad ogni classe un comportamento leggermente diverso. Quello che voglio fare è che il programmatore utilizzi questa API per creare semplicemente un'istanza basata su alcuni parametri che generano il tipo di classe corretto. E poi lui / lei vedrebbe solo i metodi disponibili per quel tipo durante la programmazione

Quindi per esempio

La mia interfaccia

interface IChange
{
    string Change(string inputString);
}

E dì che ho due classi che implementano questa interfaccia

class Changer1 : IChange
{

  public string Change(string input){

  ...
  }

  public void DoSomethingSpecial1(){

  ///code that does something specific to Changer1 class
  }

}

class Changer2 : IChange{

  public string Change(string input){

  ...
  }

  public void DoSomethingSpecial2(){

  ///code that does something specific to Changer2 class
  }


}

Quindi avrei un wrapper che imposta il Changer appropriato in base a un'enumerazione o qualche altro input dell'utente.

public enum ChangerType
{
    Type1,
    Type2
}

class MasterObject{

        public MasterObject(ChangerType type)
        {
            if (type == ChangerType.Type1)
                SetChanger(new Changer1());
            if (type == ChangerType.Type2)
                SetChanger(new Changer2());
        }

        private IChange _change;

        private void SetChanger(IChange change)
        {
            this._change = change;
        }


}

Quindi, come utente di questo, nel mio programma principale voglio fare qualcosa di simile al seguente in cui l'utente crea l'oggetto principale ma viene creato in modo tale da avere accesso solo alle funzioni appropriate. Cioè Sono disponibili solo DoSomethingSpecial1 o solo DoSomethingSpecial2 in base al tipo che hai creato.

class Program
{
    static void Main(string[] args)
    {
        MasterObject obj1 = new MasterObject(ChangerType.Type1);
        obj1.DoSomethingSpecial1();
        string result1 = obj1.Change("test");

        /// OR

        MasterObject obj2 = new MasterObject(ChangerType.Type2);
        obj2.DoSomethingSpecial2();
        string result2 = obj2.Change("test");

    }

}

Ho la sensazione che questo sia un pattern di tipo Factory o forse Abstract factory, ma non sono sicuro di come correggere il mio codice per implementarlo correttamente.

    
posta erotavlas 03.03.2014 - 18:49
fonte

2 risposte

1

C'è una ragione per cui il "parametro" che il programmatore che utilizza l'API deve fornire non può essere il nome della classe. Potrebbero creare un'istanza di un oggetto di Changer1 o Changer2. Dovranno ricordare solo un terzo nome di classe "MasterObject" e il parametro "Type1" e "Type2". E tutti i metodi che richiedono il passaggio in un parametro di uno degli oggetti possono utilizzare la classe di interfaccia.

    
risposta data 03.03.2014 - 19:04
fonte
0

Stai facendo il modello di fabbrica qui con "MasterObject". Tuttavia, se è il modo corretto dipende da come viene utilizzato. Generalmente, con la classe Factory il tuo utente sta fornendo alcune informazioni e il codice sta selezionando la classe corretta da utilizzare per rappresentare le informazioni. Sei molto vicino su questo punto. Tuttavia, il tuo MasterObject è sbagliato in quanto sta memorizzando la classe di implementazione in sé e restituendo se stesso. Generalmente, la fabbrica è solo per ricevere argomenti e quindi selezionare la migliore classe di oggetti da restituire. Nel tuo caso l'oggetto che dovresti recuperare è Changer1 o Changer2. Ho notato che stai gestendo correttamente il tipo di oggetto usando il nome dell'interfaccia come tipo.

Ora hai un'istanza di Changer1 o Changer2, che implementa l'interfaccia comune che è buona, insieme ai metodi di supporto che sono unici per la classe (come l'esempio dei metodi classici "bark" o "wag_tail").

    
risposta data 03.03.2014 - 22:07
fonte

Leggi altre domande sui tag