Pergunta

Existem algumas situações práticos de programação para alguém para declarar uma classe abstrata quando todos os métodos em que são concreto?

Foi útil?

Solução

Bem, você poderia estar usando um padrão método de modelo onde há vários pontos de substituição que todos têm implementações padrão mas onde as implementações padrão combinados por si só não são legais -. Qualquer subclasse implementação deve funcional

(E sim, eu não gosto do padrão Template Method;))

Outras dicas

Uma classe abstrata é uma classe que é declarado abstrato - que pode ou não incluir métodos abstratos. Eles não podem ser instanciado por isso, se você tem uma classe abstrata com métodos concretos, então ele pode ser uma subclasse e subclasse pode ser instanciado.

Immagine uma interface cujos métodos declarou geralmente mostram o mesmo comportamento padrão quando implementado. Ao escrever uma classe que precisa para suportar a interface você tem que definir disse comportamento padrão mais e mais.

Para facilitar a execução das suas classes concretas que você pode querer fornecer uma classe abstrata fornecendo comportamento padrão para cada método. Para suportar a interface em uma classe concreta que possa derivar dos métodos de classe e substituir abstratas se desviar do comportamento padrão. Dessa forma, você vai evitar a implementação repetida do mesmo (redundante) comportamento padrão.

Outro caso de uso possível é um decorador que delega todas as chamadas para a instância embrulhado. Uma implementação concreta decorador pode substituir apenas aqueles métodos em que a funcionalidade é adicionado:

public interface Foo {
    public void bar();
}
public abstract class FooDecorator implements Foo {
    private final Foo wrapped;
    public FooDecorator(Foo wrapped) { this.wrapped = wrapped; }
    public void bar() { wrapped.bar(); }
}
public class TracingFoo extends FooDecorator {
    //Omitting constructor code...
    public void bar() {
        log("Entering bar()");
        super.bar();
        log("Exiting bar()");
    }
}

Embora eu realmente não vejo o necessarity declarar FooDecorator tão abstrato exemplo (não-abstract: HttpServletRequestWrapper ).

respostas anteriores já atingiu as principais questões, mas há um pequeno detalhe que pode valer a pena mencionar.

Você poderia ter uma fábrica que retorna instâncias de (ocultas) subclasses da classe abstrata. A classe abstrata define o contrato com o objeto resultante, bem como fornecendo implementações padrão, mas o fato de que a classe é abstrata, tanto que o impede de ser instanciado diretamente e também sinaliza o fato de que a identidade da classe de implementação "real" não é publicada.

Querendo saber por que ninguém apontou para o exemplo prático de MouseAdapter:

http://docs.oracle. com / JavaSE / 6 / docs / api / java / awt / evento / MouseAdapter.html

Uma classe de adaptador abstrato para receber eventos de mouse. Os métodos esta classe estão vazios. Esta classe existe como conveniência para a criação de objetos de ouvinte.

Nice pergunta:)

Uma coisa é certa ... este é certamente possível. A sugestão de modelo por krosenvold é uma boa razão para fazer isso.

Eu só quero dizer que uma classe não deve ser declarado abstract apenas para impedi-la de instanciação.

Isto é referido na especificação da linguagem Java Seção 8.1.1.1

Quando você tem uma classe importante, mas o sistema não pode criar uma instância fo essa classe, porque

  • essa classe é pai de uma série de classes de sistema;
  • este tem um monte de responsabilidade (métodos usados ??por um monte de classe) para o domínio da requer;
  • essa classe não representa um objeto concreto;

servlet Exemplo:

Todos os métodos são de concreto, mas a classe base é inútil por si só:

DeleteAuthor.java

  1. classe abstrata com concreto método doGet.
  2. doGet chama arquivo apontado em protegido string sql_path.
  3. sql_path é nula .

DeleteAuthor Mantenha Book.java

  1. estende a classe abstrata DeleteAuthor
  2. conjuntos sql_path para delete_author_ Manter _BOOK.sql

DeleteAuthor Gravar Book.java

  1. estende a classe abstrata DeleteAuthor
  2. conjuntos sql_path para delete_author_ BURN _BOOK.sql
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top