Frage

Ich habe eine c # Klasse, die viele virtuelle Methoden hat, sind einige dieser Methoden im Wesentlichen abstrakt (sie in Subklassen vollständig umgesetzt werden und die Basisklasse ist leer).

Um es ich bin werfen eine InvalidOperationException in der Basisklasse mit einem Kommentar zu kompilieren, was getan werden sollte. Das fühlt sich einfach nur dreckig.

Gibt es einen besseren Weg, um meine Klassen zu entwerfen?

edit: Es ist für die mittlere Ebene einer Anwendung, die in Kanada lief werden, die Hälfte der Verfahren sind allgemein damit die virtuelle. und die Hälfte der Verfahren sind Provinz spezifisch.

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
    }

}

Hoffnung das macht Sinn

War es hilfreich?

Lösung

Denken Sie über Ihre Objekthierarchie. Haben Sie gemeinsamen Code für alle abgeleiteten Klassen teilen möchten, dann Basisfunktionalität in der Basisklasse implementieren.

Wenn gemeinsamen Basiscode finden Sie in der Vorlage Muster feststellen. Verwenden Sie eine öffentliche Methode und verketten es zu einer geschützten virtuellen Methode mit der Kern / shared Umsetzung. Beenden Sie die gemeinsame Umsetzung mit Methodenname „Core“.

Zum Beispiel:

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());
    }
}

Andere Tipps

Markieren Sie die Basisklasse als abstrakte, sowie die Methoden, die keine Implementierung haben.

Wie so

public abstract class BaseClass
{

    public abstract void AbstractMethod();
}

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

Sie können nicht haben abstrakte Methoden außerhalb einer abstrakten Klasse. eine Klasse als abstrakte Markierung bedeutet, dass Sie nicht in der Lage sein werden, es zu instanziieren. Aber dann macht es keinen Sinn zu. Was werden Sie mit einer Klasse zu tun, die nicht die Methoden sowieso nicht implementiert?

Edit: Aus bei Ihrer Klasse sucht, ja würde ich PersonComponent abstrakt mache zusammen mit der UpdatePerson Methode. Entweder das, oder wenn UpdatePerson einfach nicht tut alles für ein PersonComponent es hält wie es ist, aber die UpdatePerson Methode leer PersonComponent machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top