février
2007
En VB, on a la possibilité d’implémenter une méthode d’une interface en private / protected / friend et surcharger les méthodes pas en C#.
Sub Test()
End Interface
Public Class Class1
Implements ITest
Protected Overridable Sub Test() Implements ITest.Test
Console.WriteLine("Test1")
End Sub
End Class
Public Class Class2
Inherits Class1
Protected Overrides Sub Test()
Console.WriteLine("Test2")
End Sub
End Class
Sub Main()
DirectCast(New Class2(), ITest).Test()
Console.ReadLine()
End Sub
Et l’équivalent en C# :
{
void ITest.Test()
{
Console.WriteLine("Test1");
}
}
class Class2 : Class1, ITest
{
void ITest.Test()
{
Console.WriteLine("Test2");
}
}
interface ITest
{
void Test();
}
static void Main(string[] args)
{
(new Class2() as ITest).Test();
Console.ReadLine();
}
En C#, on aura plutôt tendance à passer par une méthode intermédiaire :
{
void ITest.Test()
{
Test();
}
protected virtual void Test()
{
Console.WriteLine("Test1");
}
}
class Class2 : Class1
{
protected override void Test()
{
Console.WriteLine("Test2");
}
}
En C#, quand on a une interface internal et qu’on voudrait que ses méthodes, dans une classe l’implémentant, soient aussi internal, il va falloir passer par une implémentation explicite appelant une méthode internal. En effet, l’interface a beau être internal, si on implémente ses méthodes autrement qu’en public, on a une erreur à la compilation.
{
void Test();
}
public class Class1 : ITest
{
void ITest.Test()
{
Test();
}
internal void Test()
{
}
}
Ce qu’on regrettera en C# comme en VB, c’est que si on a une propriété ReadOnly dans l’interface, on ne puisse pas rajouter le set dans la classe implémentant cette interface. Il faudra passer par une déclaration explicite et redéfinir la propriété en public :
{
int Prop{get;}
}
public class Test : ITest
{
private int _prop;
public int Prop
{
get { return _prop; }
set { _prop = value; }
}
int ITest.Prop
{
get { return Prop; }
}
}
En VB, il faudra nommer différemment la propriété implémentant l’interface de la propriété read/write car on n’a pas le « ITest. » devant pour les différencier