Pergunta

Eu já fiz isso antes - simplesmente não consigo me lembrar do truque.

Se eu tiver um abstrato classe:

Postagem de classe abstrata pública

E um conjunto de derivando Aulas:

Foto de aula pública: POST

Eu quero força as classes derivadas para implementar um método chamado Validar(), mas ao mesmo tempo fornecendo essencial Validação no Publicar nível.

Eu posso criar um método: Validate de vazio resumo público () dentro Publicar, que forçaria as classes derivadas a implementar o método, mas como faço para executar o Publicar (base) Validação?

O resultado final é que eu quero poder fazer isso:

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

Como eu posso fazer isso?

Foi útil?

Solução

Aqui está o que você quer:

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

Isso forçará as classes base a implementar uma técnica de validação, e o validador base será chamado por usuários externos.

É impossível fazer um método abstrato e fornecer uma implementação padrão.

Outras dicas

Crie um método de modelo público na classe Base e faça com que ele chame o método de validação de classe derivada:

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

    protected abstract void ValidateDerived();
}

Isso força as classes derivadas a implementar o método, mas fornece lógica de validação comum para a classe pós. Observe que o validate () não é o próprio virtual. Isso é mais seguro do que forçar as classes derivadas a se lembrar de ligar para base.Validate ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top