2012-07-11 11 views
6

Mam interfejsKorzystanie rodzajowy interfejs kilka razy w tej samej klasie

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

I wtedy utworzyć klasy jak ten

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

To faktycznie działa się całkiem dobrze, z wyjątkiem muszę zdefiniować jedną z dwóch funkcji z interfejsem jawnym, jak poniżej:

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

Wadą jest to, że muszę zrobić rzut za każdym razem, gdy chcę dotrzeć do Foo(), który ma wyraźny interfejs.

Jakie są najlepsze praktyki postępowania z tym?

Wykonuję aplikację zależną od wydajności, więc naprawdę nie chcę wykonywać miliona rzutów na sekundę. Czy to jest coś, co JIT wymyśli, czy też powinienem przechowywać w sobie odlewaną wersję instancji?

Nie próbowałem tego konkretnego kodu, ale wygląda okropnie blisko tego, co robię.

+0

Casting ma prawie żadnych kosztów na typów referencyjnych. – leppie

+0

Mój program zawiera rzut co piąty dodatek/mnożenie. Zakładam, że dodawanie/mnożenie jest tak tanie, że koszt odlewania staje się znaczny. –

+0

Nie bardziej kosztowne niż wywołanie interfejsu. – leppie

Odpowiedz

11

Nie można zastąpić przez typ zwracany, ale jeśli chcesz uniknąć rzucania można włączyć typ zwracany w parametr wyjściowy:

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 Interesujące myślenie :) – leppie

+0

@leppie: thanks :) –

+0

Podoba mi się ten! –

Powiązane problemy