Общие ограничения .net и проблема компиляции наследования объектов - PullRequest
0 голосов
/ 09 августа 2010

У меня следующая ситуация ниже. Этот код выдаст ошибку компилятора для Test2

Тип «InheritedChild» нельзя использовать в качестве параметра типа «T» в универсальном типе или методе «panelGenericIOGrid». Не существует неявного преобразования ссылок из InheritedChild в SerializerBase.

public class SerializerBase<T> 
{  
}
public class DirectChild    : SerializerBase<DirectChild> 
{ 
}
public class InheritedChild : DirectChild 
{ 
}

public  class panelGenericIOGrid<T> : UserControl
   where T: SerializerBase<T>, new()
{
}

...
panelGenericIOGrid<DirectChild> test;
panelGenericIOGrid<InheritedChild> test2;
...

Я почти уверен, что моя имплантация в корне неверна. Я хочу, чтобы в следующей ситуации DirectChild и InheritedChild передавали свой тип присвоения конструктору SerializerBase.

Как мне заставить код работать так, как ему нужно? Спасибо!

Некоторая информация о актуальной информации. SerializerBase имеет набор статических функций, которые реализованы для автоматической сериализации и десериализации себя в зависимости от их типа.

DirectChild имеет набор строк, которые будут сохранены на диске и восстановлены.

В Inhertiedchild есть все члены DirectChild плюс еще.

В основном мне понадобятся DirectChild.Serialize (имя файла) и IndirectChild.Serialize (имя файла), где Serialize является открытым членом SerializeBase

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Проблема в том, что InheritedChild не реализует SerializerBase<InheritedChild>, поэтому он не удовлетворяет ограничениям для T в panelGenericIOGrid<T>.

К сожалению, неясно, что решение должно быть, потому что мы не знаем, чего вы пытаетесь достичь.

Каковы члены SerializerBase<T> в реальной жизни? Если бы вы могли дать нам больше контекста, это помогло бы вам помочь.

1 голос
/ 09 августа 2010

Мне кажется, что вам не хватает интерфейса:

public interface ISerializerBase<T> { }
public class SerializerBase<T> : ISerializerBase<T> { } 
public class DirectChild : SerializerBase<DirectChild> { }
public class InheritedChild : DirectChild, ISerializerBase<InheritedChild> { } 
public class panelGenericIOGrid<T> where T: ISerializerBase<T>, new() { } 

Я не знаю, как это изменит ваш дизайн.Возможно, вам потребуется переопределить некоторые унаследованные методы или методы интерфейса в InheritedChild.

Но, может быть, вы можете сделать это в противном случае :

public interface MSerializable {}
public static class Serializable {
  public static void Serialize(this MSerializable self, string fileName) { 
    // self will refer to the right type, 
    // no need to use generics if all you want is to serialize it ...
  }
}

public class DirectChild : MSerializable { }
public class InheritedChild : DirectChild { } 
public class panelGenericIOGrid<T> where T: MSerializable, new() { } 

Будете ли вы выполнять двоичную сериализацию или сериализацию в XML?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...