Pregunta

Yo he hecho esto antes -. Simplemente no pueden recordar el truco

Si tengo un Extracto clase:

clase abstracta pública del anuncio

Y un conjunto de deriva clases:

public class Foto: Mensaje

Quiero fuerza las clases derivadas para poner en práctica un método llamado Validar () , pero al mismo tiempo, proporcionar core la validación en el post nivel.

Me puede crear un método: pública abstract void Validar () en Post , lo que obligaría a las clases derivadas para poner en práctica el método, pero entonces ¿Cómo se realiza la post (base) de validación?

El resultado final es que quiero ser capaz de hacer esto:

public class BLL
{
   public void AddPost(Post post)
   {
       post.Validate(); // includes "Post" validation, any deriving validation.
       repository.Add(post);
   }
}

¿Cómo puedo hacerlo?

¿Fue útil?

Solución

Esto es lo que desea:

public abstract class Post {

    // Default validation technique
    public void Validate()
    {
        // your base validation
        // Then call the specific validation technique
        ExtraValidate();
    }

    // Forces subclasses to provide validation technique
    protected abstract void ExtraValidate();
}

Esto obligará a las clases base para implementar una técnica de validación, y la base Validar será llamado por los usuarios externos.

Es imposible hacer un método abstracto, y proporcionar una implementación por defecto.

Otros consejos

Crear un método de plantillas públicas en la clase base y tienen que llamar al método de validación clase derivada:

public abstract class Post {
    public void Validate() {
        // Post validation
        ValidateDerived();
    }

    protected abstract void ValidateDerived();
}

Esto obliga a derivar clases para implementar el método, sino que proporciona la lógica de validación común para la clase Post. Tenga en cuenta que Validar () no es virtual en sí. Esto es más seguro que las clases derivadas obligando a tener que recordar llamar base.Validate ().

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