
Envoyé par
cobolfingaz
1. Y a-t-il d'autres utilités (que la désambiguation) à l'implémentation explicite d'interface ?
Ca permet de déclarer dans ta classe une méthode qui a le même nom qu'une méthode d'une interface implémentée mais renvoie un type différent (plus spécialisé par exemple), tout en continuant à implémenter l'interface.
Par exemple, prends le cas de la classe DbConnection :
Elle implémente l'interface IDbConnection, et doit donc implémenter (entre autres) une méthode avec la signature suivante :
public IDbCommand CreateCommand();
Si on veut utiliser des méthodes spécifiques à DbCommand (qui n'existent pas dans IDbCommand), on est obligé de faire un cast, ce qui alourdit le code. Il faudrait donc que DbConnection.CreateCommand renvoie un DbCommand, mais celà ne correspond plus à la signature de l'interface. Pour rester conforme à l'interface, la méthode IDbCommand est implémentée explicitement. On a donc 2 méthodes CreateCommand dans classe DbConnection :
1 2 3 4
| // Implémentation locale de la méthode, non conforme à IDbConnection
public DbCommand CreateCommand();
// Implémentation explicite de l'interface pour rester conforme à IDbConnection
IDbCommand IDbConnection.CreateCommand(); |
Au final, si tu appelles la méthode CreateCommand via une variable de type DbConnection, ça renvoie un DbCommand. Si tu l'appelles via une variable IDbConnection, ça renvoie un IDbConnection. Petite illustration
1 2 3 4 5 6
| DbConnection dbCnx = _factory.CreateConnection();
IDbConnection iDbCnx = dbCnx;
DbCommand dbCmd = dbCnx.CreateCommand(); // OK, renvoie un DbCommand
IDbCommand iDbCmd = iDbCnx.CreateCommand(); // OK renvoie unIDbCommand
IDbCommand iDbCmd2 = dbCnx.CreateCommand(); // OK, renvoie un DbCommand, qu'on peut affecter à un IDbCommand
DbCommand DbCmd2 = iDbCnx.CreateCommand(); // ne compile pas : IDbCommand n'est pas implicitement convertible en DbCommand |

Envoyé par
cobolfingaz
2. Quelqu'un pourrait m'expliquer l'implémentation implicite d'une interface ?
Ben c'est la manière "par défaut" d'implémenter une interface. Tu implémentes simplement des méthodes qui ont la même signature que celles de l'interface :
1 2 3 4 5 6 7 8 9 10 11
| interface I
{
void MyMethod()
}
class C : I
{
public void MyMethod()
{
Console.WriteLine(42);
}
} |

Envoyé par
cobolfingaz
Quelques classes du Framework .NET exigent un cast vers l'interface décrivant la méthode que je veux appeler par la classe dérivée, et d'autres n'exigent pas de cast.
Si une classe C implémente une interface I, elle n'est pas obligée d'implémenter I implicitement, si elle le fait explicitement.
cf. l'explication ci-dessus sur l'implémentation explicite

Envoyé par
cobolfingaz
3. Quelqu'un peut me donner un exemple de définition de classe implémentant implicitement une interface, qui évite de devoir faire un cast vers l'interface ?
cf. mon exemple pour la question 2
Partager