Pregunta

Tengo una clase c # que tiene muchos métodos virtuales, algunos de estos métodos son esencialmente abstractos (están completamente implementados en subclases y la clase base está vacía).

Para que se compile, estoy lanzando una InvalidOperationException en la clase base con un comentario sobre lo que se debe hacer. Esto simplemente se siente sucio.

¿Hay una mejor manera de diseñar mis clases?

editar: Es para el nivel medio de una aplicación que se ejecutará en Canadá, la mitad de los métodos son genéricos y, por lo tanto, virtuales. y la mitad de los métodos son específicos de la provincia.

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
    }

}

espero que esto tenga sentido

¿Fue útil?

Solución

Piensa en tu jerarquía de objetos. ¿Desea compartir código común para todas sus clases derivadas y luego implementar la funcionalidad base en la clase base?

Cuando haya compartido el código base, observe el patrón de plantilla. Use un método público y encadénelo a un método virtual protegido con la implementación central / compartida. Finalice el nombre del método de implementación compartido con " Core " ;.

Por ejemplo:

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

Otros consejos

Marque la clase base como abstracta, así como los métodos que no tienen implementación.

Me gusta así

public abstract class BaseClass
{

    public abstract void AbstractMethod();
}

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

No puedes tener métodos abstractos fuera de una clase abstracta. Marcar una clase como abstracta significa que no podrá instanciarla. Pero entonces no tiene ningún sentido. ¿Qué vas a hacer con una clase que no implementa los métodos de todos modos?

Editar: Al mirar su clase, sí, haría un resumen de PersonComponent junto con el método UpdatePerson. O eso, o si UpdatePerson simplemente no hace nada por un PersonComponent, manténgalo como está, pero deje el método UpdatePerson vacío para PersonComponent.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top