2009-03-05 11 views
4

J'ai une classe C# qui a beaucoup de méthodes virtuelles, certaines de ces méthodes sont essentiellement abstraites (elles sont entièrement implémentées dans les sous-classes et la classe de base est vide). Pour le compiler, je lève une exception InvalidOperationException dans la classe de base avec un commentaire sur ce qui doit être fait. Cela me semble juste sale.méthode abstraite dans une classe virtuelle

Existe-t-il une meilleure façon de concevoir mes cours?

éditer: C'est au niveau intermédiaire d'une application qui sera exécutée au Canada, la moitié des méthodes sont génériques d'où le virtuel. et la moitié des méthodes sont propres à la province.

Public class PersonComponent() 
{ 

public GetPersonById(Guid id) { 
    //Code to get person - same for all provinces 
} 

Public virtual DeletePerson(Guid id) { 
    //Common code 
} 

Public virtual UpdatePerson(Person p) { 
    throw new InvalidOperation("I wanna be abstract"); 
} 

Public Class ABPersonComponent : PersonComponent 
{ 
    public override DeletePerson(Guid id) 
    { 
     //alberta specific delete code 
    } 

    public override UpdatePerson(Person p) 
    { 
     //alberta specific update codecode 
    } 

} 

espoir ce sens

Répondre

1

Pensez à votre hiérarchie d'objets. Voulez-vous partager du code commun pour toutes vos classes dérivées, puis implémenter la fonctionnalité de base dans la classe de base. Lorsque vous avez un code de base partagé, notez le modèle de modèle. Utilisez une méthode publique et enchaînez-la à une méthode virtuelle protégée avec l'implémentation core/shared. Terminez la méthode d'implémentation partagée avec "Core".

Par exemple:

public abstract class BaseClass 
{ 
    protected virtual void DeletePersonCore(Guid id) 
    { 
     //shared code 
    } 

    public void DeletePerson(Guid id) 
    { 
     //chain it to the core 
     DeletePersonCore(id); 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    protected override void DeletePersonCore(Guid id) 
    { 
     //do some polymorphistic stuff 

     base.DeletePersonCore(id); 
    } 
} 

public class UsageClass 
{ 
    public void Delete() 
    { 
     DerivedClass dc = new DerivedClass(); 

     dc.DeletePerson(Guid.NewGuid()); 
    } 
} 
+0

exactement ce que j'étais après Ta. – aaron

15

Marquer la classe de base comme abstraite, ainsi que les méthodes qui n'ont pas mise en œuvre.

Comme si

public abstract class BaseClass 
{ 

    public abstract void AbstractMethod(); 
} 

public class SubClass: BaseClass 
{ 
    public override void AbstractMethod() 
    { 
     //Do Something 
    } 
} 

Vous ne pouvez pas avoir des méthodes abstraites en dehors d'une classe abstraite. Marquer une classe comme abstraite signifie que vous ne pourrez pas l'instancier. Mais alors ça n'a aucun sens. Qu'allez-vous faire avec une classe qui n'implémente pas les méthodes de toute façon?

Editer: En regardant votre classe, oui je ferais un résumé PersonComponent avec la méthode UpdatePerson. Soit cela, soit si UpdatePerson ne fait rien pour un PersonComponent, le garde tel quel, mais rend la méthode UpdatePerson vide pour PersonComponent.

+0

je suis allé à la classe de base abstraite. n'importe quel code commun peut être appelé dans des méthodes protégées (non abstraites) dans la classe de base. La raison pour laquelle une exception est levée dans la méthode de mise à jour est parce qu'elle renvoie quelque chose dans le code réel et ne va pas générer (la fonction ne renvoie aucune erreur) – aaron