Question

une question sur la conception de classe. À l'heure actuelle, j'ai la structure suivante:

abstraite base de classe du référentiel

Dépôt par défaut classe d'implémentation (implémente des méthodes abstraites, où la logique est commun à travers toutes les classes spécifiques, mais laisse un autre vide)

Classe de mise en œuvre du référentiel spécifique (implémente ce qui reste vide dans la classe ci-dessus par défaut)

Je suis maintenant venu au problème où j'ai une méthode spécifique de mise à jour () dans une catégorie spécifique mais quand tout le code dans cette méthode exécute un code de la classe de base par défaut devrait être exécutée aussi.

Je pouvais le faire comme ceci

public override Update()
{
    // do Specific class actions and updates
    // ....

    // follow with base.Update()
    base.Update();
}

mais cela nécessite les base.XYZ () dans toutes les méthodes héritées. Pourrais-je faire le tour qui en quelque sorte avec partials?

Ainsi, l'exigence est d'avoir le code dans le parent et la classe héritée (ou de faire ces deux une classe en utilisant partials) et le code de mise en œuvre de la méthode dans les deux lieux doivent être exécutés. Aussi que dire si je voulais tourner autour et exécuter du code de classe de base en premier, suivi par le code de la classe héritée?

Merci

Était-ce utile?

La solution

Avez-vous envisagé quelque chose comme:

public abstract class YourBaseClass
{
    public void Update()
    {
        // Do some stuff
        //

        // Invoke inherited class's  method
        UpdateCore();
    }

    protected abstract void UpdateCore();
}

public class YourChildClass : YourBaseClass
{
     protected override void UpdateCore()
     {
         //Do the important stuff
     }
}


//Somewhere else in code:
var ycc = new YourChildClass();
ycc.Update();

Autres conseils

Toutes les partial signifie mot-clé est que la définition du classe est divisée entre les fichiers source:

  

Il est possible de diviser la définition d'une classe ou d'une struct, une interface ou une méthode sur deux ou plusieurs fichiers source. Chaque fichier source contient une partie de la définition du type ou de la méthode, et toutes les parties sont combinées lorsque l'application est compilé.

Il reste à une définition complète de la classe dans le projet.

Vous feriez mieux de créer une sous-classe, de cette façon vous pouvez remplacer des méthodes spécifiques.

En ce qui concerne les méthodes partielles vont (à partir du même lien que ci-dessus):

  

Une déclaration de méthode partielle se compose de deux parties: la définition et la mise en œuvre. Ceux-ci peuvent être dans des parties séparées d'une classe partielle ou dans la même partie. S'il n'y a pas de déclaration de mise en œuvre, le compilateur optimise détruiront la déclaration de définition et tous les appels à la méthode.

// Definition in file1.cs
partial void onNameChanged();

// Implementation in file2.cs
partial void onNameChanged()
{
  // method body
}

Vous ne pouvez pas avoir la moitié de la méthode dans un fichier et l'autre moitié dans une autre.

Voici comment vous pouvez faire ceci:

public sealed override void Update()
{
    UpdateCore();
    base.Update();
}

public abstract /* or virtual */ void UpdateCore()
{
    // Class-specific stuff
}

Oubliez partielle, qui a entièrement différentes sémantiques. Que ce soit la overrider de votre méthode de classe de base virtuelle doit appeler la méthode de classe de base est pas automatique. Il doit faire partie de votre documentation. Un bon exemple sont les OnXxxx Les méthodes de la classe de contrôle, la bibliothèque MSDN docs () ont une « Note aux Implementer » commentaire qui avertit que l'appel de la méthode de classe de base est généralement nécessaire.

Si vous faites la méthode de classe de base abstraite alors il est cristal clair au overrider. Dans le cas contraire, vous laissez tomber un signal fort qu'il doit faire. Si vous attendez la dérogation pour remplacer complètement votre implémentation de base, alors vous devriez vraiment envisager d'en faire abstraction. Cette ambiguïté, combinée avec les chances que la overrider brise votre classe de base en remplaçant mal, est sans aucun doute l'un des points faibles du polymorphisme.

Ajouter une nouvelle méthode virtuelle (non abstraite, puisque tous la mise en œuvre spécifiques doivent la remplacer?) À votre implémentation par défaut pour tenir compte ayant leurs propres héritières étapes supplémentaires au-dessus de sa propre mise en œuvre.

Appelez la méthode virtuelle au point approprié dans la mise en œuvre de la méthode abstraite de l'implémentation par défaut.

Vous avez quitté votre classe abstraite telle qu'elle est et développée de manière transparente la flexibilité de l'implémentation par défaut.

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