2012-07-11 24 views
6

tengo una interfazUsando la interfaz genérica varias veces en la misma clase

interface IInterface<E>{ 
    E Foo(); 
} 

continuación, se crea una clase como esta

class Bar : IInterface<String>, IInterface<Int32> { 
} 

En realidad, esto funciona bastante bien, excepto que necesito para definir una de las dos funciones con la interfaz explícita, como esta:

class Bar : IInterface<String>, IInterface<Int32> { 
    String Foo(); 
    Int32 IInterface<Int32>.Foo(); 
} 

El inconveniente es que tengo que hacer un yeso cada vez que quiero llegar al Foo() que tiene la interfaz explícita.

¿Cuáles son las mejores prácticas cuando se trata de esto?

Estoy haciendo una aplicación muy dependiente del rendimiento, así que realmente no quiero hacer un millón de lanzamientos por segundo. ¿Esto es algo que resolverá el JIT, o debería almacenar una versión en caste de la instancia en sí misma?

No he probado este código específico, pero se ve muy cerca de lo que estoy haciendo.

+0

fundición tiene un costo casi nulo sobre los tipos de referencia. – leppie

+0

Mi programa contiene un molde cada quinta adición/multiplicación. Mi suposición es que la adición/multiplicación es tan barata que el costo del casting se vuelve considerable. –

+0

No es más costoso que la llamada a la interfaz. – leppie

Respuesta

11

No se puede reemplazar por el tipo de retorno, pero si quiere evitar la proyección se podía dar vuelta a su tipo de retorno en un parámetro de salida:

interface IInterface<E> { 
    void Foo(out E result); 
} 

class Bar : IInterface<string>, IInterface<int> { 
    public void Foo(out string result) { 
     result = "x"; 
    } 
    public void Foo(out int result) { 
     result = 0; 
    } 
} 

static void Main(string[] args) { 
    Bar b = new Bar(); 
    int i; 
    b.Foo(out i); 
    string s; 
    b.Foo(out s); 
} 
+0

+1 Pensamiento interesante :) – leppie

+0

@leppie: gracias :) –

+0

¡Me gusta este! –

Cuestiones relacionadas