2017-07-11 1 views
0

j'ai quelque chose comme ce qui suit:IntelliSense « Mettre en œuvre l'interface par domaine privé », ajoute casting inutile

public interface A { 
    int Foo(); 
} 
public class B : A { 
    public int Foo() { return 5; } 
} 
public class C : A { 
    private B bar; 
} 

Ce ne compilera pas, et Visual Studio met une ligne rouge sous C; c'est prévu. L'une des solutions suggérées est Implement interface through 'bar'. Lorsque vous cliquez sur ce, Visual Studio remplit C comme ceci:

public class C : A { 
    private B bar; 
    public int Foo() { return ((A) bar).Foo() } 
} 

Ce casting est tout à fait inutile. Je pourrais l'enlever manuellement, mais dans mon code actuel, A a des douzaines de méthodes et change constamment; ce serait bien si chaque fois que cela changeait, je pourrais mettre à jour C en un clic sans les moulages inutiles. Dans ma situation, il serait mieux si IntelliSense rempli comme ceci:

public class C : A { 
    private B bar; 
    public int Foo { return bar.Foo(); } 
} 

Est-il possible de dire Visual Studio pour faire à la place?

+4

Vous savez le casting est inutile, mais le compilateur ne peut pas garantir. Que faire si B a été implémenté avec une interface explicite comme 'public class B: A {public int Foo() {return -1;} int A.Foo() {return 5; }} ', ne pas avoir le cast à' A' va amener 'C' à retourner' -1' au lieu de '5'. –

Répondre

1

La conversion est requise car ce refactoring crée essentiellement un proxy pour l'interface et l'exposition des méthodes de l'interface réelle en est une partie importante. Sans lancer, vous pouvez soit appeler une mauvaise méthode, soit ne pas compiler complètement.

Sample où le code aura un résultat différent:

public class B : A 
{ 
    int A.Foo() { return 5; } 
    public int Foo() { return 42; } 
} 
public class C : A 
{ 
    private B bar = new B(); 
    public int Foo() { 
     return bar.Foo(); // returns 42 as it calls public method of B 
     return ((A) bar).Foo(); // return 5 as it calls interface A imlplementation 
    } 
} 

Sample qui ne parvient pas à compiler sans casting:

public class B : A 
{ 
    int A.Foo() { return 5; } 
} 

public class C : A 
{ 
    private B bar = new B(); 
    public int Foo() { return bar.Foo(); } // no public method Foo on B. 
}