salut.
je suis désolé si cette question a été posée, j'ai cherché dans la FAQ C# sans succès.
j'ai une interface IMessage qui représente un message à envoyer:
La classe Email implémente IMessage:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public interface IMessage { string Corps {get; set;} string Sujet {get; set;} string Expediteur {get; set;} ICollection<string> Destinataires {get; set;} void Composer(); void Concatener(Icollection<IMessage> messages); }
Le problème: le compilo râle parce que dans l'interface Concatener() prend en argument une ICollection<IMessage> alors que l'implémentation prend une ICollection<Email>.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public class Email : IMessage { public string Corps {/* Ici des get et set sur le champ privé */} public string Sujet {/* Ici des get et set sur le champ privé */} public string Expediteur {/* Ici des get et set sur le champ privé */} public ICollection<string> Destinataires {/* Ici des get et set sur le champ privé */} public MailMessage LeMail; public void Composer() {/* crée un objet MailMessage et l'attache à LeMail */} public void Concatener(ICollection<Email>) {/* concatene les corps de monEmail1+monEmail2+this */} //tous les champs privés ici... }
Pourtant Email est bien une implémentation de IMessage.
Je pourrais implémenter Concatener() comme prenant en argument une ICollection<IMessage> mais alors comment empêcher un client de concaténer des Emails et des Sms, comme dans:
J'aimerais imposer la condition suivante sur les implémentations de IMessage:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sms sms1 = new Sms(); Sms sms2 = new Sms(); ICollection<IMessage> smss = new List<Sms>(2); smss.Add(sms1); smss.Add(sms2); Email unEmail = new Email(); unEmail.Concatener(smss); //Sms implémente IMessage ! //...
chaque objet ne peut concaténer que des objets du même type.
(Je suis pas sur que le code ci-desssus compile mais c'est l'idée).
Merci !
Partager