Make Return Digitare un'interfaccia - Problema con l'inizializzazione

1

Vorrei rendere il tipo di ritorno del mio metodo un'interfaccia piuttosto che una classe per ragioni simili dichiarate in c # List o IList , tuttavia ho difficoltà a capire come inizializzare l'interfaccia per restituirla. Non riesco a utilizzare new IA() e (IA) new A() non funziona perché non posso trasmettere il risultato a B .

interface IA{}   
class A: IA{}
class B: IA{}

class UseIA
{
  public IA DesiredMethod()
  {
    return ???;// new IA()
  }
  public A UndesiredMethod()
  {
    return new A();
  }
}
    
posta Strategy Thinker 10.08.2014 - 23:08
fonte

3 risposte

3

L'implementazione di un'interfaccia è la realizzazione di tale interfaccia. La realizzazione è stata implementata all'interno della classe. Basta restituire un'istanza della classe (A o B) che realizza l'interfaccia di tipo restituito.

interface IA{}   
class A: IA{}

class UseIA
{
  public IA DesiredMethod()
  {
    return new A();
  }
}
    
risposta data 10.08.2014 - 23:21
fonte
2

Il punto di dichiarare un'interfaccia come tipo di ritorno non è quello di in realtà restituire qualcosa con solo un tipo di interfaccia. Non puoi, dal momento che le interfacce non possono essere istanziate. Il punto è rendere più esplicito il contratto del tuo metodo: "Sto restituendo qualcosa con un metodo doA() , ma non necessariamente un classico oggetto StandardA . Potrei passare a% un po 'di oggetti diSecretSuperDuperA un giorno e non sapresti la differenza. Tutto quello che sai è che qualsiasi cosa io restituisca avrà il metodo doA() di cui hai bisogno. "

In altre parole, consente allo scrittore di implementazioni più di latitudine su come eseguire il lavoro del metodo, assicurando al tempo stesso che il chiamante ottenga effettivamente il bit specifico di funzionalità di cui hanno bisogno.

    
risposta data 11.08.2014 - 09:08
fonte
0

Solo una piccola espansione su @ post di Kaan . Questo per evidenziare il polimorfismo, dal momento che l'O.P. ha due classi che implementano un'interfaccia.

interface IA { }
class A : IA { }
class B : IA { }

class UseIA
{
    public IA DesiredMethod()
    {
        return new A;   // let's say, for the purposes of the exercise, that class A is the default implementation of IA
    }

    public IA DesiredMethod(String whichImplementationOfIA)   // overloaded method
    {
        switch (whichImplementationOfIA)
        {
            case "GiveMeA": return new A();
            case "GiveMeB": return new B();
            default: 
                throw new ArgumentException();     // or, alternatively, return A, because it's a default implementation in this exercise
        }
    }
}

A proposito, il secondo scenario (dove un argomento specifica quale classe verrà creata) ricorda i modelli di Class Factory.

    
risposta data 11.08.2014 - 03:27
fonte

Leggi altre domande sui tag