Polimorfizm a implementacja obiekta

1

Hej hej hej, wiem, że lubicie odpowiadać na moje pytania :)
Możecie powiedzieć na czym polega różnica pomiędzy pierwszym a drugiem kodem? Przecież wszystko jedno wywołujemy metody speak i walk z cat, więc czemu nie można napisać Cat cat = new Cat(); i użyć metody tej klasy?
Jakie są plusy użycia polimorfizma i minusy drugiego kodu?

        HomePet cat = new Cat();
        cat.speak();
        cat.walk();

        Сat cat = new Cat();
        cat.speak();
        cat.walk();
1

Wydaje mi się, że już podobny temat zakładałeś.

Przykład jeden z najczęstszych:

Masz swój kod, wykonujesz jakąś logikę. Masz Liste obiektów:

List<Item> itemsList = new ArrayList<Item>();

Dlaczego tak, a nie

ArrayList<Item> itemsList = new ArrayList<Item>(); 

Można i tak i tak, lecz pierwsze podejście ma ten plus, że jeżeli w przyszłości, w swoim kodzie będziesz potrzebował pracować na LinkedList a nie na Arraylist, to wystarczy, że napiszesz

itemsList = new LinkedList<Item>();

Gdybyś od razu zadeklarował itemsList jako ArrayList to nie mógłbyś zmienić tego potem na LinkedList.

Kolejny przykład:
Tworzysz metodę przyjmującą jako argument HomePet dzięki czemu później w swoim kodzie, wywołując tę metodę, możesz jako argument podać i Cat i Dog i Hamster (pod warunkiem, że implementują interfejs HomePet). A jakbyś od razu zadeklarował metodę przyjmującą obiekt Cat, to nie mógłbyś do niej wrzucić obiektu typu Hamster.

3

Masz klasy A, B i C. Wszystkie implementują własną metode toString() (Wszystkie klasy dziedziczą po klasie Object)

ArrayList<Object> lista = new ArrayList<>();

A x1= new A();  // x1.toString() zwraca a
B x2= new B();  // x2.toString() zwraca b
C x3= new C();  // x3.toString() zwraca c

lista.add(x1);
lista.add(x2);
lista.add(x3);

// Na liście OBIEKTÓW w pentli wywołujesz te metody toString() jeżeli polimorfizm by nie istniał wtedy wykonała by się implementacja toString() z klasy Object
// Ale że my mamy polimorfizm z listy typu OBJECT wykonają się implementacje poszczególnych typów czyli klasy A, B i C

lista.get(0).toString() //zwraca a
lista.get(1).toString() //zwraca b
lista.get(2).toString() //zwraca c
2

@Władyslaw Parchomenko w chwili tworzenia obiektu to często sztuka dla sztuki, ale potem IDE podpowiada ten "ogólny" typ kiedy robisz jakieś extract method albo refaktorujesz. W bardziej praktycznym sensie przydaje się to w takiej sytuacji:

interface HomePet {
    void walk();

    void talk();
}

class Cat implements HomePet {

    @Override
    public void walk() {
        System.out.println("Cat walking");
    }

    @Override
    public void talk() {
        System.out.println("Cat talking");
    }

    public void jump() {
        System.out.println("Cat jumping on roofs");
    }
}

class Dog implements HomePet {

    @Override
    public void walk() {
        System.out.println("Dog walking");
    }

    @Override
    public void talk() {
        System.out.println("Dog talking");
    }

    public void bark() {
        System.out.println("Dog barking");
    }
}


public class Test {
    public void presentAnimal(HomePet pet) { // patrz jaki typ mamy tutaj, nie możemy dać ani Cat ani Dog bezpośrednio!
        pet.walk();
        pet.talk();
    }

    public static void main(String[] args) {
        Test test = new Test();
        Cat cat = new Cat();
        test.presentAnimal(cat);
        Dog dog = new Dog();
        test.presentAnimal(dog);
        HomePet somePet = new Cat();
        test.presentAnimal(somePet);
    }
}

Wyobraź sobie też przypadek Factory:

class PetFactory {
    public static HomePet createRandomPet() { // znów, tutaj nie możemy dać ani Cat ani Dog bezpośrednio!
        if (new Random().nextBoolean()) {
            return new Cat();
        } else {
            return new Dog();
        }
    }
}
0

Jak rozumiem Cat dziedziczy z HomePet? Wydaje mi się, że różnica jest taka, że w drugim przypadku nie pozwoli ci użyć metod z Cat, których nie ma w HomePet, chyba, że zrobisz rzutowanie. Przecież, Java jest statycznie typowana, nie pozwoli ci wywołać metody, której nie ma w klasie. ;)

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