Kontekst: .NET 4.0, C#C# Korzystanie z generics i implementacja interfejsu
Tworzę zestaw interfejsów i zestaw klauzul implementujących je w celu świadczenia niektórych usług. Klienci używają konkretnych klase, ale metody wywołań, które są zadeklarowane za pomocą interfejsów jako typy parametrów.
uproszczony przykład jest to jedno:
namespace TestGenerics
{
// Interface, of fields
interface IField
{
}
// Interface: Forms (contains fields)
interface IForm<T> where T : IField
{
}
// CONCRETE CLASES
class Field : IField
{
}
class Form <T> : IForm<T> where T : IField
{
}
// TEST PROGRAM
class Program
{
// THIS IS THE SIGNATURE OF THE METHOD I WANT TO CALL
// parameters are causing the error.
public static void TestMethod(IForm<IField> form)
{
int i = 1;
i = i * 5;
}
static void Main(string[] args)
{
Form<Field> b = new Form<Field>();
Program.TestMethod(b);
}
}
}
Kod sens dla mnie, ale pojawia się błąd kompilatora:
Argument 1: cannot convert from '
TestGenerics.Form<TestGenerics.Field>
' to 'TestGenerics.IForm<TestGenerics.IField>
' TestGenerics
Nie jestem pewien, co robię źle Przeczytałem wiele stron w Internecie, ale żaden nie rozwiązał mojego problemu.
Czy istnieje rozwiązanie, które nie będzie modyfikować że dużo architekturę co usiłuję zbudować:
Edit: I zaprojektowane interfejsy w taki sposób, że powinny one być niezależne od konkretnych clases które je wdrażają . Konkretne zdania mogą być ładowane z biblioteki dll, ale większość aplikacji działa z interfejsami. W niektórych przypadkach potrzebuję użyć konkretnych klauzul, szczególnie gdy używam klauzul, które wymagają serializacji.
Z góry dziękuję.
Alejandro
Byłoby to wchodzą w dziedzinie kowariancji. W szczególności, jeśli dodasz modyfikator ogólny "out" (http://msdn.microsoft.com/en-us/library/dd469487.aspx) do swojego interfejsu sygnaturowego IForm, gdzie T: "IField" to będzie działać .Dodaje to jednak inne ograniczenia/uwagi, więc nie mogę komentować, jeśli ma to zastosowanie do obecnego projektu/użycia. –
Jestem ciekawa, co próbujesz osiągnąć dzięki temu projektowi. – sidesinger
Wielkie dzięki dla obu anwersów, oni byli naprawdę niewiarygodni. Dodałem edycję wyjaśniającą, dlaczego zaprojektowałem rozwiązanie w ten sposób, ale oba rozwiązania mogą rozwiązać mój problem. pozdrowienia. – Sugar