Różnica między poliformizmem, a klasą abstrakcyjną

0

Cześć, moje pytanie może być banalne ,ale ciężko znaleźć mi na nie odpowiedź.Jaka jest różnica między polimorfizmem, a klasą abstrakcyjną? Przeglądałem filmiki Mirosława Zelenta o poliformiźmie i w pewnym momencie nazwał on klasę na której zastosował polimorfizm, klasą abstrakcyjną czy jest to to samo?

6

Taka jak pomiędzy informatyką a komputerem.
Polimorfizm to pewien mechanizm, który pozwala uzyskać różne wyniki na podstawie tego samego kawałka kodu (po szczegóły odsyłam do książek/google'a). Polimorfizm można zrealizować np. poprzez zastosowanie klasy abstrakcyjnej (+ inne elementy języka).

4

Klasa abstrakcyjna (na podstawie C#):

abstract class Mammal
{
    public abstract void Speak();
}

Polimorfizm.
Jak już wspomniał @twonek to pewien mechanizm. Dzięki niemu możemy traktować różne klasy jako jedną. Napiszmy takie klasy, dziedziczące po Mammal:

class Dog: Mammal
{
    public override void Speak()
    {
        Console.WriteLine("Hau hau");
    }
}

class Cat: Mammal
{
    public override void Speak()
    {
        Console.WriteLine("Miau");
    }
}

class Human: Mammal
{
    public override void Speak()
    {
        Console.WriteLine("Cześć!");
    }
}

Załóżmy teraz, że chciałbyś mieć populację ssaków trzymaną w liście. Nie chcesz mieć osobnej listy dla ludzi, osobnej dla kotów itd - bo to jest bez sensu. Chcesz mieć po prostu listę ssaków. Dlaczego? Dlatego, że jeśli jakiś ssak ma się zachować inaczej, to powinno to być oprogramowane w metodach abstrakcyjnych (wirtualnych).

List<Mammal> mammals = new List<Mammal>();

Teraz możesz być Bogiem i stworzyć sobie jakąś zupełnie losową populację.

Mammal CreateMammal(int mammalType)
{
    switch(mammalType)
    {
        case 0: return new Dog();
        case 1: return new Cat();
        case 2: return new Human();
    }

    return null; //albo coś domyślnego
}

//jeśli będziesz to testował to pamiętaj, że to kod przykładowy. Obiekt klasy Random musi być stworzony TYLKO RAZ podczas działania aplikacji
void CreatePopulation()
{
    Random rnd = new Random();
    for(int i = 0; i < 10; i++)
        mammals.Add(CreateMammal(rnd.Next());
}

Ten kod załatwia Ci losowe tworzenie całej populacji. Zobacz, że masz tylko jedną listę i wszystkie zwierzęta ładujesz do jednej listy. Dzięki temu, teraz możesz porozmawiać z każdym z nich w ICH języku:

foreach(Mammal m in mammals)
    m.Speak();

I teraz psy będą szczekały, koty miauczały, ludzie się witali. Nie musisz wiedzieć, jakie zwierzę kryje się pod którym elementem listy. Możesz to sprawdzić, ale tak naprawdę nie potrzebujesz tej wiedzy. To jest istota polimorfizmu.

Myślę, że całe wyjaśnienie można by skrócić do tego:

Mammal m = new Human();
m.Speak();

Teraz rozumiesz, czym różni się klasa abstrakcyjna od polimorfizmu? :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1