Question

J'ai une classe c # qui comporte de nombreuses méthodes virtuelles. Certaines de ces méthodes sont essentiellement abstraites (elles sont entièrement implémentées dans des sous-classes et la classe de base est vide).

Pour le compiler, je lance une exception InvalidOperationException dans la classe de base avec un commentaire sur ce qui doit être fait. Cela se sent juste sale.

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

modifier: C'est pour le 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 spécifiques à chaque 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
    }

}

espérons que cela a du sens

Était-ce utile?

La solution

Pensez à votre hiérarchie d'objets. Souhaitez-vous partager un code commun pour toutes vos classes dérivées, puis implémenter les fonctionnalités de base dans la classe de base?

Lorsque vous avez partagé le code de base, veuillez noter le modèle. Utilisez une méthode publique et chaînez-la à une méthode virtuelle protégée avec l'implémentation principale / partagée. Terminez la méthode de mise en œuvre 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());
    }
}

Autres conseils

Marquez la classe de base comme abstraite, ainsi que les méthodes sans implémentation.

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 de méthodes abstraites en dehors d'une classe abstraite. Marquer une classe comme abstraite signifie que vous ne pourrez pas l'instancier. Mais alors cela n’a aucun sens. Qu'allez-vous faire avec une classe qui n'implémente pas les méthodes de toute façon?

Modifier: Si vous examinez votre classe, vous pouvez créer un résumé de PersonComponent avec la méthode UpdatePerson. Soit ça, soit si UpdatePerson ne fait rien pour un PersonComponent, conservez-le en l’état, mais videz la méthode UpdatePerson pour PersonComponent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top