SÌ , ci sono casi in cui la super classe dovrebbe non essere astratta. Almeno nell'uso di Java della nozione di abstract . Se rendi una classe astratta o no è circostanziale.
Le classi astratte dovrebbero essere utilizzate quando la classe che stai descrivendo è incompleta da sola. Ad esempio:
public abstract class Animal{
public abstract boolean hasBeak();
}
La classe sopra rappresenta un animale astratto. Nel nostro programma abbiamo deciso che la cosa importante degli animali è se hanno un becco o meno. Ovviamente, questo dipende dal tipo di animale che è. Quindi le sottoclassi di Animal, Goose o Bear, ad esempio, implementeranno il metodo astratto "hasBeak ()" e Goose and Bear sono classi che hanno abbastanza informazioni per implementare hasBeak () e restituire true o false .
La classe Bear, tuttavia, potrebbe non essere astratta. Potresti avere:
public class Bear extends Animal {
protected location = "The Rockies";
public boolean hasBeak(){return false;};
public String getLocation(){return this.location;};
}
Questo è un caso in cui abbiamo deciso che un Orso non è astratto. Ci sono abbastanza informazioni che vogliamo essere in grado di creare istanze della classe Bear senza ulteriori informazioni / requisiti.
Ora possiamo avere:
public class PolarBear extends Bear {
int sealCount;
public PolarBear()
{
this.location = "The Arctic";
this.sealCount = 0;
}
public void ateSeal()
{
this.sealCount++;
}
public int getSealCount(){
return this.sealCount;
}
}
In questo esempio Bear è davvero una super classe, ed è not abstract ed è valida e significativa. Qui, vogliamo che PolarBear ottenga tutti i vantaggi del codice che abbiamo scritto per Animal e Bear, ma quanti sigilli sono mangiati è unico per gli orsi polari, quindi ha senso estendere l'orso ma per la logica / informazione del sigillo di essere esclusivi per la classe dell'orso polare.
Potresti pensare a te stesso, "Giusto, ma la tua classe di alto livello è ancora astratta in questo esempio." Sì, ma è solo una circostanza. Questo esempio è ancora valido se rimuoviamo completamente la classe Animal (e rimuoviamo l'estensione dalla classe Bear). Ora abbiamo assunto un programma che si occupa esclusivamente di orsi, ed è ragionevole e valido avere un oggetto Bear istanziato, ma è anche una super classe non astratta per PolarBear classe.