Definizione di una classe astratta senza metodi astratti


114

Posso definire una classe astratta senza aggiungere un metodo astratto?


1
Un buon esempio può essere trovato nel motivo del decoratore, vedi qui . Entrambi WindowDecoratore CoffeeDecoratorsono abstractclassi, ma nessuno dei due include un abstractmetodo.
MS Dousti

Risposte:


168

Ovviamente.

Dichiarare un abstract di classe significa solo che non si consente che venga istanziato da solo.

Dichiarare un abstract del metodo significa che le sottoclassi devono fornire un'implementazione per quel metodo.

I due sono concetti separati, anche se ovviamente non puoi avere un metodo astratto in una classe non astratta. Puoi anche avere classi astratte con finalmetodi, ma mai il contrario.


14

Si, puoi farlo. Perché non provi a farlo?


6
E non è solo l'OP. Guarda tutti i voti positivi che la domanda ha ottenuto!
Marc W

54
@ karim79 Non servono cavalli alti e tutta quella roba per versare la salsa. Provarlo non rivela del tutto perché è consentito, mentre chiederlo potrebbe.
biziclop

7
@bizclop - Provarlo da solo potrebbe aver prodotto una domanda più produttiva. Non ci sono cavalli alti. Questo è piuttosto semplice. La sua domanda era "Posso" piuttosto che "Perché fa questo ...".
karim79

8
Se è possibile rispondere alla domanda con un semplice sì o no, il richiedente dovrebbe prendere in considerazione la possibilità di riformulare, utilizzare Google o semplicemente provarlo.
Tyler Treat

3
@ karim79 Sì, la domanda avrebbe potuto essere formulata meglio, ma immagino che non ci voglia molto sforzo per guardare un passo avanti.
biziclop

8

Si, puoi. La classe astratta utilizzata in java significa che non è possibile creare un oggetto della classe. E un metodo astratto le sottoclassi devono fornire un'implementazione per quel metodo.

Quindi puoi facilmente definire una classe astratta senza alcun metodo astratto.

Per esempio:

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

Questo va bene.


6

SÌ Puoi creare una classe astratta senza alcun metodo astratto il miglior esempio di classe astratta senza metodo astratto è HttpServlet Il
metodo astratto è un metodo che non ha corpo, Se hai dichiarato almeno un metodo nella classe, la classe deve essere dichiarata come abstract è obbligatorio MA se si dichiara la classe abstract non è obbligatorio dichiarare il metodo abstract all'interno della classe.

Non è possibile creare oggetti di classe astratta, il che significa che non è possibile istanziarlo.


4

Sì, puoi dichiarare una classe che non puoi istanziare da sola solo con metodi che hanno già implementazioni. Ciò sarebbe utile se si desidera aggiungere metodi astratti in futuro o se non si desidera che la classe venga istanziata direttamente anche se non ha proprietà astratte.


La domanda non riguardava classi astratte vuote, ma solo classi astratte senza metodi astratti. Non c'è motivo valido per quanto posso vedere per l'utilizzo di una classe astratta completamente vuota.
biziclop

1
Risposta fissa. L'uso di una classe astratta vuota potrebbe essere utile se avessi una buona ragione per voler aggiungere metodi astratti in un secondo momento e non dovessi occuparti del refactoring di altre classi genitore.
Gordon Gustafson,

1
Nel mezzo di una gerarchia, una classe astratta completamente vuota (ad eccezione delle specifiche di ereditarietà) può avere senso se le derivazioni di quella classe avranno obblighi contrattuali diversi da quelli di altre derivazioni del genitore.
supercat

3

sì, possiamo dichiarare una classe astratta senza alcun metodo astratto. lo scopo di dichiarare una classe come astratta non è di istanziare la classe.

quindi due casi

1) classe astratta con metodi astratti.

questo tipo di classi, dobbiamo ereditare una classe da questa classe astratta e dobbiamo sovrascrivere i metodi astratti nella nostra classe, es: classe GenricServlet

2) classe astratta senza metodi astratti.

questo tipo di classi, dobbiamo ereditare una classe da questa classe astratta, es: lo scopo della classe HttpServlet è anche se se non implementi la logica nella classe figlia puoi ottenere la logica genitore

controlla il codice sorgente di HttpServlet


2

Sì, possiamo avere una classe astratta senza metodi astratti poiché entrambi sono concetti indipendenti. Dichiarare un abstract di classe significa che non può essere istanziato da solo e può solo essere sottoclassato. Dichiarare un abstract del metodo significa che il metodo verrà definito nella sottoclasse.


Perché non dovrei desiderare che la classe non possa essere istanziata? Qualche buona ragione, esempio?
karlihnos

1

Si, puoi farlo.

dichiarare la classe astratta significa che la classe non verrà istanziata da nessun'altra classe.

e dovrebbe esserci almeno un metodo astratto al suo interno e il significato di quello che puoi dichiarare metodo astratto in quella classe se non stai dichiarando metodo che è ok.

esempio:

public abstract class abs {

    protected int cx = 0, cy = 0;

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

questo funzionerà di sicuro.


1

Si, puoi. A volte potresti chiederti che qual è lo scopo di farlo? La risposta è: a volte dobbiamo limitare la classe dall'istanziare da sola. In tal caso, vogliamo che l'utente estenda la nostra classe Abstract e installi la classe figlia


1

Sì, puoi definire una classe astratta senza un metodo astratto. Tuttavia, se non è presente alcun metodo all'interno, potresti utilizzare un'interfaccia


4
Bella idea per prendere il limite minimo di 30 caratteri.
Marc W

1
Se non esiste un metodo astratto, come può essere utilizzata un'interfaccia? L'interfaccia ha tutti i metodi astratti per impostazione predefinita.
Usman Rana

1

Puoi, la domanda nella mia mente è più dovresti. Fin dall'inizio, dirò che non esiste una risposta dura e veloce. Fai la cosa giusta per la tua situazione attuale.

Per me l'eredità implica una relazione "è-un". Immagina una classe di cani, che può essere estesa con sottotipi più specializzati (alsaziano, barboncino, ecc.). In questo caso, rendere astratta la classe del cane può essere la cosa giusta da fare poiché i sottotipi sono cani. Ora immaginiamo che i cani abbiano bisogno di un collare. In questo caso l'ereditarietà non ha senso: non ha senso avere una relazione "è-un" tra cani e collari. Questa è sicuramente una relazione "ha-un", il collare è un oggetto di collaborazione. Rendere astratto il collare solo in modo che i cani possano averne uno non ha senso.

Trovo spesso che le classi astratte senza metodi astratti esprimano davvero una relazione "ha-un". In questi casi di solito trovo che il codice possa essere meglio scomposto senza utilizzare l'ereditarietà. Trovo anche che le classi astratte senza un metodo astratto siano spesso un odore di codice e almeno dovrebbero portare a domande sollevate in una revisione del codice.

Di nuovo, questo è del tutto soggettivo. Potrebbero esserci situazioni in cui una classe astratta senza metodi astratti ha senso, dipende interamente dall'interpretazione e dalla giustificazione. Prendi la decisione migliore per qualunque cosa tu stia lavorando.


1

In realtà non c'è motivo se una classe astratta non ha alcun metodo astratto. Una classe astratta è come un padre. Questo padre ha alcune proprietà e comportamenti, quando tu da bambino vuoi essere un figlio del padre, il padre dice che il bambino (tu) deve essere così, è il nostro MOTO, e se non vuoi farlo, tu non sono mio figlio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.