Prima di tutto, gli esempi saranno in C #. Ma penso che non avrai problemi a capirlo. Quindi ...
NON PUOI creare un'istanza di oggetti di una classe astratta. Devi avere una sottoclasse che deriva dalla classe, se vuoi istanziarla. Ma questo probabilmente non ti aiuterà poiché potresti averlo già visto prima.
Quindi proviamo con un esempio.
Supponiamo di voler perdere peso e il tuo nutrizionista ti chiede di monitorare l'assunzione di cibo. Quando vai da lei di nuovo, non puoi dirle che hai mangiato un "cibo". Anche se non è sbagliato, dal momento che tutto il cibo ha calorie, è troppo "astratto" per lei. Quindi devi dirle quale cibo.
Quindi, se dovesse codificarlo ... Avrebbe una classe astratta Food.
abstract class Food
{
public int CaloriesPerPound { get; set; }
//...
}
Perché? Perché questo non ti permetterebbe di dire "Ho mangiato un cibo".
{
Food fries = new Food(); //This won't even compile
}
Quindi hai bisogno di lezioni concrete:
class Fruit : Food
{
//Other stuff related only to fruits
}
class Bread : Food
{
//Other stuff related only to Bread
}
Quindi dovrai dire esattamente quale cibo è.
{
Apple desert = new Apple(); //Now we are talking
}
Ma lei ha ancora bisogno della lezione di cucina, è comunque interessante per lei:
class Meal
{
public List<Food> Foods { get; set; }
//Other meal related stuff
public int TotalCalories()
{
int calories = 0;
foreach (Food food in Foods)
{
calories = calories + food.CaloriesPerPound * FoodQuantity;
}
return calories;
}
}
Questo è un esempio di quando hai bisogno di una classe astratta. Quando vuoi avere una classe base, ma non vuoi che qualcuno crei un oggetto della tua classe.
Una CAN astratta ha metodi astratti. Non è necessario. È assolutamente ok avere una classe astratta senza metodi astratti. A proposito di ...
Il metodo astratto è qualcosa che è troppo ampio. Non ci sono somiglianze su come funzionano le cose, quindi le classi che derivano dalla tua classe che ha un metodo astratto non saranno in grado di chiamare l'implementazione di super-classe. E stai anche costringendo tutte le sottoclassi a implementare la loro versione di quel metodo.
Proviamo un altro esempio? Un simulatore di bande animali. Avresti degli animali e ognuno di loro emetterebbe un suono. Ma queste sono "implementazioni" molto diverse, non hanno nulla in comune. Un cane è diverso da un gatto, un gatto da un elefante, un elefante da un cricket. Quindi avresti un metodo astratto MakeSound.
class Animal
{
public abstract void MakeSound();
}
Ma, se hai un metodo astratto nella tua classe, ciò rende l'intera classe astratta!
abstract class Animal
{
public abstract void MakeSound();
}
Quindi il resto del codice potrebbe essere:
class Dog : Animal
{
public void MakeSound()
{
//bark at the moon
}
}
class Cat : Animal
{
public void MakeSound()
{
//meowing for food
}
}
E la BAND!
class AnimalBand
{
public List<Animal> Animals { get; set; }
public void RockOn()
{
foreach (Animal animal in Animals)
{
animal.MakeSound();
}
}
}
Quindi questo è un esempio di quando usi un metodo astratto.
Credo che questa sia l'essenza. Potrebbe essere un po 'forzato / contorto, ma penso che dia il merito. Torna agli esempi che non ti hanno aiutato prima e vedi se hanno senso ora.
Io esco su un ramo e dico che sei un principiante. Questa roba può sembrarti strana e potresti non notare alcun vantaggio nell'uso di classi astratte.
Va bene. È strano per quasi tutti noi quando iniziamo. Ma col tempo imparerai ad apprezzarlo.