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:

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);
}
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
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...
}
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>.

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:
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 !
 
//...
J'aimerais imposer la condition suivante sur les implémentations de 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 !