2010-05-10 4 views
3
interface ILol 
{ 
    void LOL(); 
} 

class Rofl : ILol 
{ 
    void ILol.LOL() 
    { 
     GlobalLOLHandler.RaiseROFLCOPTER(this); 
    } 
    public Rofl() 
    { 
     //Is there shorter way of writing this or i is there "other" problem with implementation?? 
     (this as ILol).LOL(); 
    } 
} 
+1

Essayez d'éviter d'appeler des fonctions «virtuelles» d'un constructeur! Vous pouvez finir par appeler une implémentation qui accède à un objet non entièrement construit. –

Répondre

10

Vous avez mis l'interface explicitly qui, en général, vous n'avez pas besoin de le faire. Au lieu de cela, tout mettre en œuvre implicitement et l'appeler comme vous le feriez pour tout autre méthode:

class Rofl : ILol 
{ 
    public void LOL() { ... } 

    public Rofl() 
    { 
     LOL(); 
    } 
} 

(. Notez votre mise en œuvre devra également être public)

+1

Vous vous rendez compte que votre exemple de code l'implémenter explicitement encore, non? :) –

+1

Bon seigneur, c'est embarrassant. Fixe - merci !! – ladenedge

+0

Quelle est la différence entre implémentation implicite et explicite? Si je n'ajoute pas ILol. avant LOL, alors le compilateur se plaint qu'il n'y a pas d'implimentation de ILol.LOL. –

4

Ne pas utiliser as, juste jeté:

((ILol)this).LOL(); 
9

Vous pouvez modifier la distribution (this as ILol)-((ILol)this). Un cast est autorisé à retourner null, ce qui pourrait causer des erreurs plus tard et que le compilateur doit tester.

+1

Reviens? Qu'est-ce qui ne va pas avec le casting 'as', par rapport au non-' as'? – bobobobo

+0

L'utilisation de l'objet renvoyé par 'as' avant de rechercher null est une mauvaise pratique. Le code ci-dessus ne présentera aucun problème tel qu'il est écrit, mais ne sera pas aussi résistant lors du refactoring. – ladenedge

+0

L'incantation peut retourner null, donc le compilateur doit tester null avant d'appeler la méthode afin qu'il puisse générer l'exception de référence nulle. une distribution régulière ne peut jamais renvoyer de valeur nulle, de sorte que le compilateur peut élider le test pour null. – Stewart

0

Non, pas si vous implémentez explicitement l'interface. Si vous le faites implicite en supprimant le nom d'interface de la méthode implémentée, cela fonctionnera comme vous le souhaitez.

void LOL() 
{ 
    GlobalLOLHandler.RaiseROFLCOPTER(this); 
} 
public Rofl() 
{ 
    LOL(); 
} 
-2

Vous n'avez pas besoin de jeter du tout. Depuis ROFL implémente ILOL vous pouvez simplement appeler this.LOL() ou même simplement LOL();

+1

-1 Incorrect. ROFL implémente explicitement 'ILOL' et ne peut pas accéder aux membres' ILOL' sans avoir accès à une instance ('this' casted) de' ILOL'. – statenjason

Questions connexes