2009-08-05 8 views
2

Je développe en C# .net et je crois que j'ai besoin d'utiliser des génériques pour le problème que j'ai mais je ne sais pas par où commencer.Incorporation de génériques

Voici les étapes que je dois faire:

  1. Get ID de l'utilisateur - FAIT
  2. table de base de données de requête en utilisant ID - DONE
  3. Tirez une ligne - DONE
  4. Créer un objet de type dépendant ID
  5. objet Populate dépend du type

Différents rendez-vous nécessitent que des informations différentes soient extraites (remplies) de la base de données. Par exemple, un rendez-vous peut seulement exiger les noms d'utilisateurs/nom de famille où un autre peut exiger nom/prénom/dob.

Je souhaite que la classe enfant s'exécute d'abord, puis appelle la méthode parente. Le problème est que myAppointment est toujours traité en tant qu'objet de rendez-vous et non en tant que DoctorAppointment/OtherAppointment une fois qu'il a passé l'instruction Switch. Où MonRendezVous est déclaré en fait je ne sais quel type d'objet est-il va être

Voici le code que j'ai actuellement:

 tblAppointment getAppointment = (from getApp in dc.tblAppointments 
             where getApp.appID == Id 
             select getApp).SingleOrDefault(); 

// Needs to be set the something. I really want this be to set to a generic type as I don’t really know what type it will be until it has been through the switch statement 
Appointment myAppointment = null; 

      switch (getAppointment.tblAppointment.appTypeID) 
      { 
       case 2: 
        { 
// Changes myAppointment from Appointment to DoctorsAppointment 
         myAppointment = new DoctorsAppointment(); 

        } 
        break; 
       case 1: 
        { 
         myAppointment = new OtherAppointment(); 
        } 
        break; 
       default: 

        break; 

      } 

// I want this to set myAppointment to DoctorsAppointment.Populate(getAppointment) 
      return myAppointment.Populate(getAppointment); 

Rendez-vous est la classe mère. MédecinsRendez-vous/autreRendez-vous en classe enfant.

Le remplissage dans les classes enfant nécessite un paramètre, contrairement à la classe parent. L'erreur que je reçois actuellement est:

No overload for method 'Populate' takes '1' arguments 

J'espère que je me suis assez expliquée.

Merci,

Clare

+0

est-Appointment.Populate une méthode virtuelle? En outre, vous avez une exception NullReferenceException ici lorsque appTypeID n'est pas 1 ou 2 ... – JBRWilkinson

Répondre

2

vous suggère de prendre l'une des réponses de l'héritage ci-dessus

Je pensais que cela valait la peine de demander si vous utilisez LINQ to SQL? Le type de fonctionnalité dont vous avez besoin est partiellement implémenté pour vous si vous avez une table qui stocke différents types d'objets.

Voir here un exemple

+0

J'utilise LINQ to SQL mais je ne suis pas sûr de la façon dont Guy Burstein l'a implémenté. Ai-je besoin d'utiliser le mappage de base XML? – ClareBear

+0

Le diagramme de classe montré dans l'article, est-ce dans le dbml? – ClareBear

+0

Oui. Autrement dit, vous devez normalement ajouter le fichier DBML. Puis faites glisser et déposez des objets de l'explorateur de serveur dans celui-ci. Cela générerait alors des classes. Dans les cas où vous avez une table de base de données mappée à une hiérarchie d'héritage, vous devrez effectuer manuellement une adaptation pour montrer au DBML comment fonctionne votre hiérarchie. – MattH

4

Une solution est, en classe parent rendez-vous, faire méthode comme ceci:

public virtual void Populate(getAppointment) 
{ 
    // does nothing 
} 

Et puis dans les classes d'enfants:

public override void Populate(getAppointment) 
{ 
// do what you need 
} 
+0

Je veux que la classe enfant s'exécute d'abord, puis appelle la méthode parente. Le problème est que myAppointment est toujours traité en tant qu'objet de rendez-vous et non en tant que DoctorAppointment/OtherAppointment une fois qu'il a passé l'instruction Switch. Lorsque myAppointment est déclaré, je ne sais pas quel type d'objet va être. – ClareBear

+0

Est-ce que 'getAppointment' manque son type? ou suis-je en train de mal interpréter votre code? – Svish

+0

getAppointment est défini via un objet LINQ. tblAppointment getAppointment = (à partir de getApp dans dc.tblAppointments où getApp.appID == Id select getApp) .SingleOrDefault(); – ClareBear

2

On dirait un cas d'héritage

abstract class Appointment 
{ 
    public abstract void Populate(AppointmentData data); 
} 

class DoctorsAppointment : Appointment 
{ 
    public override void Populate(AppointmentData data) 
    { 
     // implementation specific to DoctorsAppointment 
    } 
} 
class OtherAppointment : Appointment 
{ 
    public override void Populate(AppointmentData data) 
    { 
     // implementation specific to OtherAppointment 
    } 
} 
+0

Je pense que vous voulez dire "abstrait", pas "virtuel" ... parce que les méthodes virtuelles doivent avoir un corps, et donc le code ci-dessus ne compilera pas –

+0

merci, tapé dans ceci avant le débogage, devrait être corrigé maintenant –

0

Vous devez modifier la méthode Populate de Nomination pour qu'elle soit abstraite (éventuellement virtuelle) et prenne le type de getAppointment. Les sous-classes DoctorsAppointment et OtherAppointment implémentent Popuplate en remplaçant la valeur par défaut de Rendez-vous.

0
abstract class Appointment 
{ 
    public abstract string Populate(AppointmentData d); 
} 

class OtherAppointment : Appointment 
{ 
    public override string Populate(AppointmentData d) 
    { 

    } 
} 

Faire Appointment une classe abstraite ne peut pas être instancié par lui-même et faire la méthode abstraite populate et il doit être mis en œuvre par ses classes hérité

1

La classe Appointment doit déclarer la méthode Populate appropriée.Vous pouvez également configurer une classe usine de rendez-vous:

static class AppointmentFactory 
{ 
    public static Appointment Create(int type) 
    { 
     switch (type) 
     { 
      case 2: 
       return new DoctorsAppointment(); 
      case 1: 
       return new OtherAppointment(); 
      default: 
       throw new AppointmentTypeNotSupportedException(); 
     } 
    } 
} 

class Appointment 
{ 
    public virtual void Populate(getAppointment data) { } 
} 

class DoctorsAppointment : Appointment 
{ 
    public override void Populate(getAppointment data) { } 
} 

class OtherAppointment : Appointment 
{ 
    public override void Populate(getAppointment data) { } 
} 
Questions connexes