C# Interface<T> { T Func<T>(T, t);} : Interfaces Génériques avec Paramétrée Méthodes Génériques Types de Retour
J'ai pensé que je pourrais utiliser certains (ce que je croyais) simple génériques à appliquer CRUD sur certaines Classes d'Affaires.
par exemple.
public interface IReadable <T>
{
T Read<T>(string ID);
}
et puis, peut-être, je pourrais avoir un NoteAdapter faire CRUD avec la Note de la classe, par exemple.
public class NoteAdapter : IReadable<Note>
{
public Note Read<Note>(string ID) {
return new Note();
}
}
Mais pour une raison quelconque, te compilateur est de se confondre si j'ai à la fois un générique Type de retour et une fonction Paramétrée avec le même Type générique. C'est , si je fais :
public interface IReadable <T>
{
void Read<T>(string ID);
}
public class NoteAdapter : IReadable<Note>
{
public void Read<Note>(string ID) {
return new Note();
}
}
Il compile fine, bien qu'il ne marche pas faire ce que je veux !
Aussi, ce :
public interface IReadable <T>
{
T Read (string ID);
}
public class NoteAdapter : IReadable<Note>
{
public Note Read(string ID) {
return new Note();
}
}
fonctionne très bien ainsi, lui aussi Bien qu'elle ne satisfait pas aux exigences ! - Pourquoi ?
Parce que je peux pas avoir une Classe qui implémente un tas de ces Interfaces ..par exemple.
public interface IReadable <T>{
T Read (string ID);
}
public class UniversalAdapter : IReadable<Note>, IReadable<Customer> ...
{
public Note Read(string ID) {
return new Note();
}
public Customer Read(string ID) {
return new Customer();
}
}
Coz, cela ne serait pas compiler comme type de retour ne font pas partie des méthodes de signature !
J'ai eu l'impression, en C# 3.5 +
T Foo(T t);
T Foo<T> (T t);
T Foo(<SomeType> someInstance);
Tous ont des signatures différentes! Ce qui me manque ici ?
Vous devez vous connecter pour publier un commentaire.
Vous avez overspecified l'interface. Vous déclarez
T
dans la définition de l'interface, mais alors vous redeclare dans la méthode de définition:En raison de cette confusion, vous vous retrouvez avec une erreur lorsque vous essayez d'implémenter l'interface.
Pour résoudre ce problème, vous devez simplement supprimer le paramètre générique de la
Read
fonction, à la fois dans l'interface, et dans leNoteAdapter
classe:EDIT:
Ok, j'ai lu le reste de ton post, et il semble que vous avez déjà découvert que ce qui "fonctionne", mais vous avez l'air de penser que c'est incorrect. Pourquoi? Quelles sont les exigences que n'est-ce pas se rencontrer?
public interface IReadable <T>
{
T Read<T>(string ID);
}
ici vraiment autre Ts :
IReadable <T> and T Read<T>(string ID)
peut-être juste
public interface IReadable <T>
?{
T Read(string ID);
}
parce que sinon, est égale à
public interface IReadable <T>
{
X Read<X>(string ID);
}
Bon Génériques tutoriel
EDIT:
Peut-être vous avez besoin
public interface IReadable <T> { T Read(T ID); }
?Le CIL ne prend pas en charge surcharge de la méthode par le type de retour.