Je me suis retrouvé avec quelque chose comme le code suivant dans un projet sur lequel je travaille. Je pensais que c'était vraiment étrange que je sois autorisé à le faire, mais maintenant je commence à me demander ce qui est probablement une gaffe architecturale de ma part m'a conduit à cela.Polymorphisme d'interface étrangement bizarre à l'aide de la composition d'interface
Mes questions à vous sont:
- Qu'est-ce que ce appelle exactement?
- Quelles sont les utilisations dans le monde réel?
- Pourquoi quelqu'un voudrait-il faire cela?
Voici mes Interfaces:
namespace ThisAndThat
{
public interface ICanDoThis
{
string Do();
}
public interface ICanDoThat
{
string Do();
}
public interface ICanDoThisAndThat : ICanDoThis, ICanDoThat
{
new string Do();
}
}
Voici ma classe concrète:
namespace ThisAndThat
{
public class CanDoThisAndThat : ICanDoThisAndThat
{
public string Do()
{
return "I Can Do This And That!";
}
string ICanDoThis.Do()
{
return "I Can Do This!";
}
string ICanDoThat.Do()
{
return "I Can Do That!";
}
}
}
Et mes essais décisifs:
using Xunit;
namespace ThisAndThat.Tests
{
public class ThisAndThatTests
{
[Fact]
public void I_Can_Do_This_And_That()
{
ICanDoThisAndThat sut = new CanDoThisAndThat();
Assert.Equal("I Can Do This And That!", sut.Do());
}
[Fact]
public void I_Can_Do_This()
{
ICanDoThis sut = new CanDoThisAndThat();
Assert.Equal("I Can Do This!", sut.Do());
}
[Fact]
public void I_Can_Do_That()
{
ICanDoThat sut = new CanDoThisAndThat();
Assert.Equal("I Can Do That!", sut.Do());
}
}
}
Merci, en vous donnant la réponse parce que vous avez fourni le nom exact de ce qui se passe. –
Downvoted que vous avez beaucoup d'erreurs dans votre réponse. Tout d'abord, la classe 'CanDoThisAndThat' implémente TROIS interfaces, pas deux. 'ICanDothisAndThat' indique que, lorsqu'il est implémemnted, vous devez également implémenter les deux autres interfaces. En outre, SyncRoot n'est pas explicitement défini par des implémentations pour le cacher afin de décourager l'utilisation, il est généralement fait pour garder les membres rarement utilisés hors du site, ou si le fait qu'une interface soit implémentée n'a pas d'importance. Regardez http://msdn.microsoft.com/en-us/library/system.collections.icollection.syncroot.aspx et http://msdn.microsoft.com/en-us/library/bb356596.aspx. – Andy
Non, dans cette documentation, il est dit que vous ne devriez pas utiliser SyncLock, et qu'ils ne sont pas marqués comme obsolètes, ce qui est vraiment le cas lorsque quelque chose ne devrait plus être utilisé. – Andy