Rzutowanie w dół

0

Witam,
mając klasę student oraz czlowiek chcialbym najpierw stworzyc czlowieka i przypisac mu kilka cech a potem w zależności od wyboru użytkownika przekazać go do metody jako studenta, nauczyciela itd.
Wygląda to tak:

class Czlowiek {
}

class Student extends Czlowiek {
}

class Nauczyciel extends Czlowiek {
}
Czlowiek c = new Czlowiek();
switch (wybor) {
case 1:
    Student s = (Student)c;
    edytujStudenta(s);
    break;
case 2:
    Nauczyciel n = (Nauczyciel)c;
    edytujNauczyciela(n);
    break;
}

Niestety dostaję błąd: czlowiek cannot be cast to student. Mógłbym robić tak:

switch (wybor) {
case 1:
    Student s = new Student();
    s.setImie(c.getImie())
    edytujStudenta(s);
    break;
case 2:
    Nauczyciel n = (Nauczyciel)c;
    n.setImie(c.getImie())
    edytujNauczyciela(n);
    break;
}

Ale jest tu dużo powielania kodu. W takim razie jak to powinienem zrobić?

0

Załóżmy, że w klasie Student istnieje dodatkowe pole string NazwaUczelni;, którego nie ma w klasie Czlowiek. W takiej sytuacji co oraz dlaczego powinien wyświetlić poniższy kod?

Czlowiek c = new Czlowiek();
Student s = (Student)c;

System.out.println(s.getNazwaUczelni());

Oprócz tego pozostaje kwestia zarządzania pamięcią - skoro tworzysz instancję klasy Czlowiek, która zajmuje x bajtów, w jaki sposób nagle ma się ona rozszerzyć do rozmiaru y, gdy w klasie pochodnej znajdują się dodatkowe pola?

0

Ja ostatnio robiłem to w ten sposób że najpierw sprawdzałem wybór użytkownika i później tworzyłem na podstawie tego obiekt. Z tego co piszesz to Ty najpierw chcesz stworzyć obiekt, a później sprawdzić w tym obiekcie jaki docelowy obiekt masz stworzyć.

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