2010-08-09 3 views
0

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

Тип «InheritedChild» не может использоваться как параметр типа «T» в панели «общий тип или метод» GenericIOGrid. Нет никакого неявного преобразования ссылок из '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; 
... 

Я убежден мой implentation это funadmentally неправильно. Я хочу, чтобы следующая ситуация: DirectChild и InheritedChild передадут свой тип утверждения в Constialator SerializerBase.

Как заставить код работать так, как ему нужно? Благодаря!

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

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

У Inhertiedchild есть все члены DirectChild plus more.

В основном я буду нуждаться в DirectChild.Serialize (имя файла), и IndirectChild.Serialize (имя файла), где Serialize является членом общественного SerializeBase

ответ

1

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

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.

Но, может быть, вы можете сделать это otherwise:

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?

+0

Я думаю, что интерфейс - лучший способ пойти. Это будет некоторый дополнительный код, но поскольку каждый метод в BaseSerializer статичен, его не слишком много дополнительной работы. Благодаря! – greggorob64

+0

Если каждый метод статичен, я думаю, что вы действительно должны пойти с подходом mixin ... Наследование не имеет смысла в этом случае, поскольку вы не можете иметь статические методы в интерфейсе, и вы не можете реализовать методы интерфейса со статическими из них. –

2

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

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

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

+0

См. Править, я добавил некоторую информацию – greggorob64