12
votes

Méthode de classe qui n'est pas dans l'interface

J'ai une question C # simple (donc je crois). Je suis débutant avec la langue et j'ai rencontré un problème concernant les interfaces et les classes qui les mettent en œuvre. Le problème est

J'ai l'interface ia code> p> xxx pré>

et 3 classes qui implémentent l'interface: classe B code> B code> , C code> et d code> p> xxx pré>

si la classe B avait une autre méthode qui n'est pas dans l'interface, disons Méthode4 () code> et j'ai ce qui suit: p> xxx pré>

et j'utiliserais: p>

element.method4();


3 commentaires

si (élément est typeOf (B)) ((B) élément) .method4 (); cela devrait aider


Un nouvel utilisateur nouveau demandant une question claire et bien formatée. C'est rare, félicitations et bienvenue. :)


Bonne question. +1 Si vous donnez le scénario réel, nous pouvons vous conseiller sur le meilleur design APROCH.


3 Réponses :


4
votes

Oui, c'est possible. Il vous suffit de jeter le type d'interface sur le type de classe comme celui-ci:

if(element is B)
{
    ((B)element).method4();
}


10 commentaires

Remarque côté: vous pouvez ajouter si (élément est typeof (b)) pour vous assurer que l'élément est B


Vous ne voulez probablement pas faire ça?


@Sam Leach: Pourquoi ne voudriez-vous pas faire cela? C'est une tâche commune


Mais dans une autre idée, pouvez-vous faire cela avec le casting?


@ Romanozumbé Il ne semble pas vrai. Peut-être créer une autre interface qui hérite du premier et d'ajouter la méthode4 ()?


est le mot-clé ne fonctionne pas comme ça, vous avez besoin si (élément est b) pour le faire fonctionner


@ user2629277 - Cela ressemble à votre code de mélange ensemble qui veut juste fonctionner via l'interface (qui devrait fonctionner pour B , C , d ou Toute autre mise en œuvre), et code qui "sait" spécifiquement qu'il fonctionne avec un B . C'est généralement un signe d'un design quelque peu confus.


@Sam lixivial. Comment allez-vous cela si vous êtes par exemple itératant sur la collection Windows Controls et souhaitez exécuter une méthode sur, disons chaque bouton? Dans de tels cas, vous devez lancer.


@Sam Leach, si une autre interface est créée, il ne pourra toujours pas y accéder sans la jeter, car il fait toujours une instance d'IA.


Je suis d'accord avec vous deux. Je pense que la conception doit être re-pensée. Selon le contexte réel, il est difficile de conseiller.



2
votes

sans casting, vous pourriez faire cela. XXX

NB: essayez d'utiliser le capital i préfixe pour les interfaces C #.


2 commentaires

Cela évite la dactylographie et la coulée, mais vous avez maintenant un objet différent, ifoo. Si l'utilisateur dispose d'un objet IA, il serait toujours nécessaire de vérifier si cet objet est un IFOO (et de le jeter), de pouvoir exécuter la méthode4.


Oui, mais design-sage, il est plus intelligent de travailler contre les interfaces comme celle-ci, que celle des types de béton. C'est une solution qui échoue mieux car il est maintenant plus facile d'étendre quels types implémentent les différentes interfaces.



2
votes

Vous devez lancer le type d'interface sur le type de classe; Habituellement, nous le faisons au moyen de comme : xxx

l'avantage de "comme" est qu'il y a un seul mise en oeuvre, tandis que " est "et (b) doivent faire deux moulages.


0 commentaires