Контекст: .NET 4.0, C#C# Использование дженериков и интерфейс реализации
Я создаю набор интерфейсов и набор clases, которые реализуют их, чтобы обеспечить некоторую услугу. Клиенты используют конкретные кланы, но вызывают методы, объявленные с использованием интерфейсов в качестве типов параметров.
упрощенный пример это один:
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);
}
}
}
код имеет смысл для меня, но я получаю ошибку компиляции:
Argument 1: cannot convert from '
TestGenerics.Form<TestGenerics.Field>
' to 'TestGenerics.IForm<TestGenerics.IField>
' TestGenerics
я не уверен, что я делаю неправильно , Я прочитал много страниц в Интернете, но никто не решил мою проблему.
Есть ли решение, которое не было бы модифицировать так много архитектуры, что я пытаюсь построить:
Edit: Я разработал интерфейсы таким образом, чтобы они должны быть независимыми от конкретных clases, которые реализуют их , Бетонные кладки могут быть загружены из dll, но большая часть приложения работает с интерфейсами. В некоторых случаях мне нужно использовать конкретные кланы, особенно при использовании класов, которые необходимо сериализовать.
Заранее спасибо.
Алехандро
Это подпадает под сферу ковариации. В частности, если вы добавите модификатор ['out' generic modifier] (http://msdn.microsoft.com/en-us/library/dd469487.aspx) к вашему сигнатурному интерфейсу IForm, где T: IField', то он будет работать ,Но это добавляет другие ограничения/соображения, поэтому я не могу комментировать, применим ли это для вашего текущего дизайна/использования. –
Мне любопытно, что именно вы пытаетесь выполнить с помощью этого дизайна. – sidesinger
Большое спасибо за обоих поклонников, они были действительно шутливыми. Я добавил редактирование, объясняющее, почему я решил решение таким образом, но оба андерса могут исправить мою проблему. С уважением. – Sugar