Wpis z mikrobloga

@Goryptic: no pewnie to cudownie nie wie, że przypsujesz coś do _name z klasy bazowej. Może tak to zrób jakoś:

public Dog(string _name, int _age, string _rasa) : base(_name, _age) {...
albo wywal konstruktor z klasy bazowej.
  • Odpowiedz
@szwe: @DrBear: ale przecież konstruktory się nie dziedziczą? Więc one nie powinny nawet "wiedzieć o swoim istnieniu" nawzajem i name w konstruktorze Dog nie powinien w żaden sposób kolidować z name w konstruktorze Animal.
  • Odpowiedz
@Goryptic: jeżeli dziedziczysz z klasy która ma niedefaultowy konstruktor to tworząc obiekt klasy dziedziczącej musisz ten konstruktor zawołać.

name w konstruktorze Dog nie powinien w żaden sposób kolidować z name w konstruktorze Animal


przecież nic nie koliduje
  • Odpowiedz
@szwe: zaraz, czyli jeśli Animal ma zmienną X w swoim konstruktorze, to wszystkie klasy, które dziedziczą z Animal, też MUSZĄ się odnieść do tej zmiennej X w swoich konstruktorach?
  • Odpowiedz
@Goryptic: nie. Jeżeli Animal ma konstruktor, czyli metodę do tworzenia tego obiektu to wszystkie klasy dziedziczące z klasy Animal, tworząc siebie, muszą stworzyć klasę bazową wołając ten konstruktor. Po to jest konstruktor żeby go zawołać tworząc obiekt. W pewnym sensie też ustala to sposób tworzenia obiektu, więc gdy dziedziczysz nie masz pozwolenia na tworzenie obiektu bazowej klasy po swojemu tylko zgodnie z tym konstruktorem.
  • Odpowiedz
@Goryptic: W twoim przypadku mówisz, że Animal tworzysz przez podanie 2 zmiennych. Nie możesz zawołać bezparametrowego konstruktora. Musisz podać te 2 argumenty.
Jak dziedziczysz z Animala to tworząc sobie Psa musisz stworzyć bazowy obiekt i tutaj ponownie, możesz go stworzyć tylko wołając ten konstruktor który tam zdefiniowałeś. Bo sam określiłeś takie wymaganie definiując tam odpowiedni konstruktor.
  • Odpowiedz
więc gdy dziedziczysz nie masz pozwolenia na tworzenie obiektu bazowej klasy po swojemu tylko zgodnie z tym konstruktorem.


@szwe: nie podoba mi się to. Da się to jakoś obejść?
  • Odpowiedz
@Goryptic: Nie dodawać konstruktora w klasie bazowej.
W każdym razie w twoim przypadku patrząc na to co robisz to zawołanie tego konstruktora jest najlepszym rozwiązaniem. Chcesz inicjalizować te 2 pola z klasy Animal to wołasz sobie odpowiedni konstruktor za pomocą base tak jak ci pokazałem i już. Nie musisz pisać tego przypisania w konstruktorze w klasie Dog. Dodasz tam tylko ten trzeci argument. Zresztą po coś chyba ten konstruktor
  • Odpowiedz