Definindo uma classe abstrata sem quaisquer métodos abstratos


114

Posso definir uma classe abstrata sem adicionar um método abstrato?


1
Um bom exemplo pode ser encontrado no padrão do decorador, veja aqui . Ambos WindowDecoratore CoffeeDecoratorsão abstractclasses, mas nenhum inclui um abstractmétodo.
MS Dousti de

Respostas:


168

Claro.

Declarar uma classe abstrata significa apenas que você não permite que ela seja instanciada por conta própria.

Declarar um método abstrato significa que as subclasses devem fornecer uma implementação para aquele método.

Os dois são conceitos separados, embora obviamente você não possa ter um método abstrato em uma classe não abstrata. Você pode até ter classes abstratas com finalmétodos, mas nunca o contrário.


14

Sim, você pode fazer isso. Por que você simplesmente não tenta fazer isso?


6
E não é apenas o OP. Veja todos os votos positivos que a pergunta obteve!
Marc W

54
@ karim79 Não há necessidade de cavalos altos e todo aquele negócio de derramar molho. Tentar não revela exatamente por que é permitido, mas talvez sim.
biziclop

7
@bizclop - Testar sozinho pode ter gerado uma pergunta mais produtiva. Não há cavalos altos. Isso é muito simples. Sua pergunta era 'Posso' em vez de 'Por que isso ...'.
karim79

8
Se a pergunta puder ser respondida com um simples sim ou não, o autor da pergunta deve considerar reformular a frase, usar o Google ou simplesmente experimentar.
Tyler Treat

3
@ karim79 Sim, a pergunta poderia ter sido formulada melhor, mas acho que não é preciso muito esforço para olhar um passo à frente.
biziclop

8

Sim você pode. A classe abstrata usada em java significa que você não pode criar um objeto da classe. E um método abstrato que as subclasses têm que fornecer uma implementação para esse método.

Assim, você pode definir facilmente uma classe abstrata sem nenhum método abstrato.

Como por exemplo :

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Isto é bom.


6

SIM Você pode criar uma classe abstrata sem qualquer método abstrato; o melhor exemplo de classe abstrata sem método abstrato é HttpServlet.
Método abstrato é um método que não tem corpo. Se você declarou pelo menos um método na classe, a classe deve ser declarada como um abstract é obrigatório, MAS se você declarou a classe abstrata, não é obrigatório declarar o método abstrato dentro da classe.

Você não pode criar objetos de classe abstrata, o que significa que não pode ser instanciado.


4

Sim, você pode declarar uma classe que não pode instanciar por si só com métodos que já possuem implementações. Isso seria útil se você quisesse adicionar métodos abstratos no futuro ou se não quisesse que a classe fosse instanciada diretamente, embora não tenha propriedades abstratas.


A questão não era sobre classes abstratas vazias, apenas classes abstratas sem métodos abstratos. Não há nenhuma razão válida, até onde posso ver, para usar uma classe abstrata completamente vazia.
biziclop

1
Resposta corrigida. Usar uma classe abstrata vazia pode ser útil se você tiver um bom motivo para adicionar métodos abstratos posteriormente e não precisar lidar com a refatoração de nenhuma outra classe pai.
Gordon Gustafson

1
No meio de uma hierarquia, uma classe abstrata completamente vazia (exceto para a especificação de herança) pode fazer sentido se as derivações dessa classe tiverem obrigações contratuais diferentes daquelas de outras derivações do pai.
supercat

3

sim, podemos declarar uma classe abstrata sem nenhum método abstrato. o propósito de declarar uma classe como abstrata não é instanciar a classe.

então dois casos

1) classe abstrata com métodos abstratos.

esses tipos de classes, devemos herdar uma classe desta classe abstrata e deve substituir os métodos abstratos em nossa classe, ex: classe GenricServlet

2) classe abstrata sem métodos abstratos.

este tipo de classes, devemos herdar uma classe desta classe abstrata, ex: HttpServlet objetivo da classe de fazer é embora você se você não implementar sua lógica na classe filha, você pode obter a lógica pai

verifique o código-fonte do HttpServlet


2

Sim, podemos ter uma classe abstrata sem métodos abstratos, pois ambos são conceitos independentes. Declarar uma classe abstrata significa que ela não pode ser instanciada por conta própria e só pode ser subclassificada. Declarar um método abstrato significa que o Método será definido na subclasse.


Por que eu não deveria querer que a classe não possa ser instanciada? Alguma boa razão, exemplo?
karlihnos

1

Sim, você pode fazer isso.

declarar classe abstrata significa que a classe não será instanciada por nenhuma outra classe.

e deve haver pelo menos um método abstrato dentro disso e significando que você pode declarar o método abstrato naquela classe se você não estiver declarando o método, então está ok.

exemplo:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

isso vai funcionar com certeza.


1

Sim você pode. Às vezes, você pode receber esta pergunta: qual é o propósito de fazer isso? A resposta é: às vezes temos que restringir a instanciação da classe por conta própria. Nesse caso, queremos que o usuário estenda nossa classe Abstract e instancie a classe filha


1

Sim, você pode definir uma classe abstrata sem um método abstrato. No entanto, se não houver nenhum método dentro, é melhor usar uma interface


4
Boa ideia para ocupar o limite mínimo de 30 caracteres.
Marc W

1
Se não houver um método abstrato, como uma interface pode ser usada? Interface possui todos os métodos abstratos por padrão.
Usman Rana

1

Você pode, a questão em minha mente é mais você deveria. Desde o início, direi que não existe uma resposta dura e rápida. Faça a coisa certa para sua situação atual.

Para mim, herança implica um relacionamento 'é-um'. Imagine uma classe de cães, que pode ser estendida por subtipos mais especializados (Alsaciano, Poodle, etc). Nesse caso, tornar a classe cão abstrata pode ser a coisa certa a fazer, já que os subtipos são cães. Agora vamos imaginar que os cães precisam de uma coleira. Nesse caso, a herança não faz sentido: é um absurdo ter uma relação 'é-a' entre cães e coleiras. Este é definitivamente um relacionamento 'tem um', colar é um objeto de colaboração. Tornar a coleira abstrata apenas para que os cães possam ter uma não faz sentido.

Costumo descobrir que classes abstratas sem métodos abstratos estão realmente expressando um relacionamento 'tem-um'. Nesses casos, geralmente acho que o código pode ser melhor fatorado sem usar herança. Também acho que classes abstratas sem nenhum método abstrato costumam ser um cheiro de código e, pelo menos, devem levar a questões levantadas em uma revisão de código.

Novamente, isso é totalmente subjetivo. Pode haver situações em que uma classe abstrata sem métodos abstratos faça sentido; depende inteiramente da interpretação e da justificativa. Tome a melhor decisão para qualquer coisa em que esteja trabalhando.


1

Na verdade, não há como dizer se uma classe abstrata não possui nenhum método abstrato. Uma classe abstrata é como um pai. Esse pai tem algumas propriedades e comportamentos, quando você como filho quer ser filho do pai, o pai fala o filho (você) que deve ser assim, é o nosso MOTO, e se você não quiser, você não são meus filhos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.