2010-08-11 9 views
1

Je n'arrive pas à essayer d'implémenter une méthode/propriété partagée entre deux classes créées par le concepteur linq2sql.Classe abstraite dans LINQ2SQL pour le partage de méthodes courantes

Mes deux classes ont deux propriétés principales (provenant du modèle db):

public partial class DirectorPoll 
{ 
    public bool Completed {get; set;} 
    public bool? Reopen { get; set; } 
    //more properties 
} 

public partial class StudentPoll 
{ 
    public bool Completed {get; set;} 
    public bool? Reopen { get; set; } 
    //more properties 
} 

Maintenant, par exemple, je crée une classe abstraite:

public abstract class GenericPoll 
{ 
    public abstract bool Completed { get; set; } 
    public abstract bool? Reopen { get; set; } 

    public bool CanEdit 
    { 
     get 
     { 
      if (Completed == false) return true; 
      if (Reopen.GetValueOrDefault(false) == false) return false; 
      return true; 
     } 
    } 
} 

Puis

public partial class DirectorPoll : GenericPoll 
public partial class StudentPoll: GenericPoll 

Mais quand j'essaie de compiler, il est écrit "Director n'implémente pas le membre abstrait hérité GenericPoll.Completed .obtenir". Mais c'est là. Donc, je pense que je suis obligé de mettre un override à la propriété générée automatiquement par le concepteur, mais si je mets à jour la base de données plus tard et recompile, il me donnera la même erreur.

Je pense que je pourrais manquer quelque chose ici mais j'ai essayé différentes approches sans succès. ¿Alors que puis-je faire ici, en plus de mettre en œuvre CanEdit dans chacune de mes classes partielles? Merci

Répondre

2

Il n'est pas mis en œuvre comme override, il ne compte pas. Cependant, les implémentations d'interface implicites font nombre, donc cela fonctionne:

partial class DirectorPoll : IGenericPoll {} 
partial class StudentPoll : IGenericPoll {} 
public interface IGenericPoll 
{ 
    bool Completed { get; set; } 
    bool? Reopen { get; set; } 
} 
public static class GenericPoll { 
    public static bool CanEdit(this IGenericPoll instance) 
    { 
     return !instance.Completed || instance.Reopen.GetValueOrDefault(); 
    } 
} 
+2

Nous sommes Borg de Graveet. Crains Nous. –

+0

Nice =) Merci à tous les deux! – Francisco

2

Une option: créer une interface contenant Completed et Reopen, rendre les classes implémentent l'interface (via les bits manuels des classes partielles), puis écrire une méthode d'extension qui étend cette interface. Je pense qui devrait fonctionner:

public interface IPoll 
{ 
    bool Completed {get; set;} 
    bool? Reopen { get; set; } 
} 

// Actual implementations are in the generated classes; 
// no need to provide any actual code. We're just telling the compiler 
// that we happen to have noticed the two classes implement the interface 
public partial class DirectorPoll : IPoll {} 
public partial class StudentPoll : IPoll {} 

// Any common behaviour can go in here. 
public static class PollExtensions 
{ 
    public static bool CanEdit(this IPoll poll) 
    { 
     return !poll.Completed || poll.Reopen.GetValueOrDefault(false); 
    } 
} 

Certes il doit être une méthode plutôt qu'une propriété, car il n'y a pas une telle chose comme une propriété d'extension, mais ce n'est pas trop de difficultés.

(je crois que mon refactoring de votre logique CanEdit est correcte Tous les trues et explicites faisaient faux ma tête;.)

+0

lol; J'adore comment nous avons tous les deux combattu le «retour» dégoûtant; p Votre '!' Est mal placé, btw. –

+0

@Marc: Doh - cela serait dû à l'oubli d'inclure 'poll' pour la première fois :) –

+0

J'ai remarqué ça aussi; J'étais trop occupé à simplifier pour commenter, p –