Polimorfizm. Problem z przypisaniem wartości.

Odpowiedz Nowy wątek
2019-05-02 16:31

Rejestracja: 3 lata temu

Ostatnio: 2 miesiące temu

0

Hej,

Mam klasę abstrakcyjną Animal, która jest klasą bazową. Mam też drugą klasę Bear, która dziedziczy po Animal. Po utworzeniu obiektu występuje problem z przypisaniem wartości do zmiennej klasy Bear. Mógłbym użyć konstruktora, ale chcę wiedzieć czemu tak się dzieje, że nie mogę tego zrobić tak jak to przedstawiłem poniżej:

package MainPackage;

public abstract class Animal{
    int id;
    String name;
    float weight;
    void introduce(){
        System.out.println(" My name is " + name + " and my weight is " + weight);
    }
}
class Bear extends Animal{
    int furlength;
    @Override
    void introduce(){
        System.out.println(" My name is " + name + " and my weight is " + weight + ". My fur length is " + furlength);
    }
}
public class Main{
    public static void main(String[] argv){
        Animal bear = new Bear();
        bear.name = "Yogi";
        bear.weight = 200;
        bear.furlength = 40;
    }
}

Blad pojawia się w polu furlength przy przypisywaniu wartości 40. Czy to pole jest prywatne?

PS: Jakieś uwagi dotyczące dobrych praktyk? Poprawić dostepy?

edytowany 4x, ostatnio: FrankySanky, 2019-05-02 16:35

Pozostało 580 znaków

2019-05-02 16:38

Rejestracja: 6 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Kraków

0

No bo masz obiekt typu Animal a nie Bear. Nie wiesz w tym miejscu, że pod spodem jest Bear to i nie masz dostępu do zmiennej.

Pozostało 580 znaków

2019-05-02 17:19

Rejestracja: 1 rok temu

Ostatnio: 4 tygodnie temu

W dużym uproszczeniu przypisując Bear do Animal, masz dostęp tylko do pól i metod z klasy Bear co znajdują się w klasie Animal. Poprzez rzutowanie i ewentualnie instanceof możesz uzyskać dostęp do reszty elementow Bear, ale to moze sobie na razie nie mieszaj ;)

edytowany 1x, ostatnio: DamianSn, 2019-05-02 17:20

Pozostało 580 znaków

2019-05-02 17:25

Rejestracja: 3 lata temu

Ostatnio: 2 miesiące temu

0
DamianSn napisał(a):

W dużym uproszczeniu przypisując Bear do Animal, masz dostęp tylko do pól i metod z klasy Bear co znajdują się w klasie Animal. Poprzez rzutowanie i ewentualnie instanceof możesz uzyskać dostęp do reszty elementow Bear, ale to moze sobie na razie nie mieszaj ;)

Właśnie użyłem rzutowania i działa. Dzięki za pomoc ;)

Polecam ten artykuł i ogólnie całą serię o Javie. Dosyć dobrze opisuje co tak na prawdę się tam dzieje. Link : https://www.samouczekprogrami[...]a-i-rzutowanie-w-jezyku-java/ - DamianSn 2019-05-02 17:31

Pozostało 580 znaków

2019-05-02 20:18

Rejestracja: 15 lat temu

Ostatnio: 1 godzina temu

4

Kilka zasad w Javie:

  • typ referencji określa do jakich składowych masz dostęp
  • wybór konkretnego pola z obiektu zależy od typu referencji (bo pola nie są wirtualne)
  • wybór konkretnej implementacji metody nie zależy od typu referencji (bo metody są wirtualne)

Przykład:

class Parent {
  int i;
  int get() { return i; }
  @Override String toString() { return "parent"; }
}
class Child extends Parent {
  int i; // to pole przesłania pole z rodzica, nie nadpisuje go
  @Override int get() { return i; }
  @Override String toString() { return "child"; }
}

Child asChild = new Child();
Parent asParent = asChild;

// poniższe dwa pola są różne!
asChild.i = 5;
asParent.i = 8;

System.out.println(asChild.i); // wyświetli 5
System.out.println(asParent.i); // wyświetli 8

// wywołana zostanie ta sama implementacja metody, bo niestatyczne nieprywatne metody w Javie są wirtualne
System.out.println(asChild.get()); // wyświetli 5
System.out.println(asParent.get()); // wyświetli 5

System.out.println(asChild); // wyświetli "child"
System.out.println(asParent); // wyświetli "child"

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 3x, ostatnio: Wibowit, 2019-05-02 20:20

Pozostało 580 znaków

2019-05-03 18:48

Rejestracja: 5 lat temu

Ostatnio: 2 godziny temu

1

Aż dziwnie, że jeszcze nikt tego nie napisał. W przykładzie który podałeś używanie rzutowania to niezbyt dobra praktyka. Generalnie ustawiane pól przez InstancjaKlasy.pole = wartość to też do dobrych zasad programowania nie należy. W Twoim przykładzie wystarczyłoby użyć po prostu konstruktora z parametrami. Czyli


Animal bear = new Bear("Yogi", 200, 40);

Pozostało 580 znaków

2019-05-03 19:57

Rejestracja: 3 lata temu

Ostatnio: 3 godziny temu

Lokalizacja: PL

1
podroznik napisał(a):

Aż dziwnie, że jeszcze nikt tego nie napisał. W przykładzie który podałeś używanie rzutowania to niezbyt dobra praktyka. Generalnie ustawiane pól przez InstancjaKlasy.pole = wartość to też do dobrych zasad programowania nie należy. W Twoim przykładzie wystarczyłoby użyć po prostu konstruktora z parametrami. Czyli


Animal bear = new Bear("Yogi", 200, 40);

Co racja to racja, ale czasem, żeby komuś ułatwić zrozumienie podstaw nie warto mu za bardzo mieszać

Pozostało 580 znaków

Odpowiedz

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