2010-08-09 19 views
0

J'ai la situation suivante ci-dessous. Ce code génère une erreur de compilation pour Test2.net contraintes génériques et héritage de l'objet compilation problème

Le type 'InheritedChild' ne peut pas être utilisé comme paramètre de type 'T' dans le type générique ou la méthode 'panelGenericIOGrid'. Il n'y a pas de conversion de référence implicite de '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; 
... 

Je suis assez convaincu mon implentation est funadmentally mal. Je veux la situation suivante, à la fois DirectChild et InheritedChild donneront leur type appropriote à la constature SerializerBase.

Comment puis-je faire en sorte que le code fonctionne comme il le devrait? Merci!

Quelques informations sur les informations actuelles. SerializerBase dispose d'un ensemble de fonctions statiques implémentées pour se sérialiser et se désérialiser automatiquement en fonction de leur type.

DirectChild dispose d'un ensemble de chaînes qui seront stockées sur le disque et récupérées.

Inhertiedchild a tous les membres de DirectChild plus plus.

Fondamentalement, je vais avoir besoin DirectChild.Serialize (nom de fichier), et IndirectChild.Serialize (nom de fichier), où le sérialisation est membre public SerializeBase

Répondre

1

Il me semble que vous manque une interface:

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() { } 

Je ne sais pas comment cela va changer votre conception bien. Il se peut que vous deviez réimplémenter des méthodes héritées ou des méthodes d'interface dans le InheritedChild.

Mais, vous pouvez peut-être faire 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() { } 

Est-ce que vous faites une sérialisation binaire, ou allez-vous sérialisation à XML?

+0

Je pense que l'interface est la meilleure façon de procéder. Il va y avoir du code supplémentaire, mais puisque chaque méthode dans BaseSerializer est statique, ce n'est pas trop de travail supplémentaire. Merci! – greggorob64

+0

Si chaque méthode est statique, je pense que vous devriez vraiment aller avec l'approche mixin .... L'héritage n'a pas de sens dans ce cas, car vous ne pouvez pas avoir de méthodes statiques dans une interface et vous ne pouvez pas implémenter des méthodes statiques ceux –

2

Le problème est que InheritedChild n'implémente pas SerializerBase<InheritedChild>, donc il ne remplit pas les contraintes pour T en panelGenericIOGrid<T>.

Malheureusement, il n'est pas clair que la solution est destinée à être car nous ne savons pas ce que vous essayez d'atteindre.

Quels sont les membres de SerializerBase<T> dans la vraie vie? Si vous pouviez nous donner plus de contexte, cela nous aiderait à vous aider.

+0

Voir modifier, j'ai ajouté quelques informations – greggorob64