2013-07-17 13 views
7

Sto utilizzando un'interfaccia in C# e invece di scrivere una classe completamente nuova che implementa tale interfaccia è possibile solo creare un oggetto che implementa tale interfaccia? L'interfaccia è definita comeCreazione di un'istanza di un'interfaccia in C#

public interface ITokenStore 
{ 

    IToken CreateRequestToken(IOAuthContext context); 


    IToken CreateAccessToken(IOAuthContext context); 
} 

E so che in Java ho potuto qualcosa come

ITokenStore tokenStore = new ITokenStore() 
    { 
     IToken CreateRequestToken(IOAuthContext context) { 
      IToken requestToken = null; 

      return requestToken; 
     } 

     IToken CreateAccessToken(IOAuthToken context) { 
      IToken accessToken = null; 

      return accessToken; 
     } 
    }; 

C'è un modo equivalente a un'istanza in caso di un'interfaccia in C#?

+1

Java sta ancora creando una classe dietro le quinte, è solo zucchero sintattico e, in un certo senso, la loro soluzione alla mancanza di delegati/puntatori di funzione. – Dai

+1

Con un framework di simulazione è possibile creare un'istanza, ad esempio 'new Mock ()'. Potresti voler configurare le implementazioni concrete dei metodi che il framework di simulazione potrebbe fare da un delegato. –

+0

possibile duplicato di [Esiste un equivalente C# di questo?] (Http://stackoverflow.com/questions/15581737/is-there-a-c-sharp-equivalent-of-this) – nawfal

risposta

11

L'unico modo per "Creare un'istanza di un'interfaccia in C#" è creare un'istanza di un tipo che implementa l'interfaccia.

+0

Questo è l'unico modo? Non può essere fatto come in Java? – azrosen92

+0

Sarà compilato come una classe anonima. –

+6

No, non è possibile farlo in .NET/C# e, per essere chiari, * non è possibile farlo in Java *. Ciò che il compilatore fa in Java è costruire il tipo anonimo per te, un * tipo che implementa l'interfaccia *. Quindi Java ha una scorciatoia per ottenere quel tipo, C# no. –

3

Le interfacce non hanno alcuna logica in base alla progettazione. Semplicemente non fanno nulla.

Instantiating uno senza una classe di applicazione non ha nemmeno senso

0

Non è possibile creare un'istanza di un'interfaccia in C#. È necessario creare un'istanza di una classe/tipo che implementa tale interfaccia.

Potrebbe voler leggere su interfaces in C#. Non c'è modo di "fingere" come fa Java.

Sono gentile se incuriosito da questo concetto anche se è disponibile in un'altra lingua. Suppongo che potresti usare una classe anonima con i parametri dei delegati se il tuo consumatore sapeva come fingere duck typing. Ma a stento sembra che ne valga la pena.

0

Qualcosa di simile a questo:

public class MyTokenStore: ITokenStore 
{ 
    public IToken CreateRequestToken(IOAuthContext context) 
    { 
     ...some code here... 
    } 
    public IToken CreateAccessToken(IOAuthContext context) 
    { 
     ...some code here... 
    } 
} 

quindi utilizzarlo:

ITokenStore x = new MyTokenStore(); 
0

Come gli altri hanno detto, no, questo non è possibile.

Tuttavia, è possibile scrivere una classe generalizzata con delegati per ciascun metodo. Qualcosa di simile a quanto segue:

public class DelegateTokenStore : ITokenStore 
{ 
    public delegate IToken TokenCreator(IOAuthContext context); 
    public TokenCreator RequestTokenCreator { get; set; } 
    public TokenCreator AccessTokenCreator { get; set; } 

    public IToken CreateRequestToken(IOAuthContext context) 
    { 
     return RequestTokenCreator(context); 
    } 

    public IToken CreateAccessToken(IOAuthContext context) 
    { 
     return AccessTokenCreator(context); 
    } 
} 

allora si potrebbe utilizzare in questo modo:

ITokenStore tokenStore = new DelegateTokenStore() 
{ 
    RequestTokenCreator = (context) => 
    { 
     IToken requestToken = null; 
     return requestToken; 
    }, 
    AccessTokenCreator = (context) => 
    { 
     IToken accessToken = null; 
     return accessToken; 
    }, 
}; 

non sto dicendo che è necessariamente una buona idea di prendere questo approccio. Come qualsiasi cosa, l'adeguatezza dipende dal tuo caso d'uso.

2

Se si vuole veramente questo:

private static void Main(string[] args) 
    { 
     IFoo foo = new IFoo(); // <- interface 
     foo.Print(); 

     Console.ReadKey(); 
    } 


    [ComImport, Guid("A7D5E89D-8FBD-44B7-A300-21FAB4833C00"), CoClass(typeof(Foo))] 
    public interface IFoo 
    { 
     void Print(); 
    } 

    public class Foo : IFoo 
    { 
     public void Print() 
     { 
      Console.WriteLine("Hello!"); 
     } 
    } 

Ma se si apre compilato il montaggio su ildasm.exe, si vedrà:

IL_0001: newobj instance void TestApp.Program/Foo::.ctor()

1

Per quanto ne so .NET non si ha il Concetto di Java di classi interne anonime. Esiste una tipica esigenza di implementazioni dinamiche di un'interfaccia in scenari di test unitari.Così può essere uno sguardo su alcuni quadri beffardi dinamiche può essere interessante per voi, per esempio

  1. Impromptu Interface (include il supporto per dinamica)
  2. Moq

Dai un'occhiata a galleria NuGet per pacchetti taggati con mocking.