• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z wyświetleniem elementów listy z użyciem klasy abstrakcyjnej

Object Storage Arubacloud
0 głosów
114 wizyt
pytanie zadane 21 grudnia 2020 w C# przez kuba412 Początkujący (310 p.)

Witam, mam pewien problem. Napisałem taką klasę 

 class Katalog : Pozycja
    {
        private string dzialTematyczny;
        List<Pozycja> pozycje = new List<Pozycja>();

        public Katalog()
        {
            dzialTematyczny = "pusty";
            tytul = "pusty";
            id = 0;
            wydawnictwo = "pusty";
            rokWydania = 0;
        }
        public Katalog(string dzialTematyczny_, string tytul_, int id_, string wydawnictwo_, int rokWydania_)
        {
            dzialTematyczny_ = dzialTematyczny;
            tytul_ = tytul;
            id_ = id;
            wydawnictwo_ = wydawnictwo;
            rokWydania_ = rokWydania;

        }

        public Pozycja dodajPozycje(string dzialTematyczny_, string tytul_, int id_, string wydawnictwo_, int rokWydania_)
        {
            Pozycja pozycja = new Katalog(dzialTematyczny_, tytul_, id_, wydawnictwo_, rokWydania_);
            pozycje.Add(pozycja);
            return pozycja;
        }
         public override void wypiszInfo()
        {
            foreach (Pozycja poz in pozycje)
            {
                Console.WriteLine(dzialTematyczny + " " + tytul + " " + id + " " + wydawnictwo + " " + rokWydania);
            }
        }

    }
}

Gdzie Pozycja jest klasą abstrakcyjną. metoda wypiszInfo wyświetla mi tylko puste, 0, itp. elementy które zapisałem w konstruktorze i za żadne skarby nie mogę przypisać nic innego. Mogł by ktoś uświadomić mi w czym popełniam błąd? 

Z góry dziękuję

1 odpowiedź

0 głosów
odpowiedź 21 grudnia 2020 przez adrian17 Ekspert (344,860 p.)

Tak, bo po pierwsze:

class Katalog : Pozycja
    {
        List<Pozycja> pozycje = new List<Pozycja>();

Samo to dziedziczenie nie ma sensu. Tak, katalog jest listą pozycji. Ale katalog nie jest pozycją (chyba że to jakoś umiesz uzasadnić), więc tego dziedziczenia w ogóle nie powinno być.

Po drugie:

            foreach (Pozycja poz in pozycje)
            {
                Console.WriteLine(dzialTematyczny + " " + tytul + " " + id + " " + wydawnictwo + " " + rokWydania);
            }

Wypisujesz tutaj pola instancji klasy na której wywołałeś metodę, a nie obiektów po których się iterujesz.

komentarz 21 grudnia 2020 przez kuba412 Początkujący (310 p.)

Katalog dziedziczy po Pozycja pola tytul, rokWydania, itp., oraz ma w sobie virtualną funkcję wypiszInfo, którą muszę nadpisać. Zmieniłem pętlę na taką:

            foreach (Pozycja pozycja in pozycje)
            {
                Console.WriteLine(pozycja);
            }

Jednak nic to nie dało, wyświetla się PO3.Katalog

komentarz 21 grudnia 2020 przez adrian17 Ekspert (344,860 p.)

Katalog dziedziczy po Pozycja pola tytul, rokWydania, itp.

I próbuję przekazać że to nie ma sensu, bo katalog nie jest pozycją; katalog nie ma przecież "roku wydania".

Tak samo to:

        public Pozycja dodajPozycje(string dzialTematyczny_, string tytul_, int id_, string wydawnictwo_, int rokWydania_)
        {
            Pozycja pozycja = new Katalog

Do katalogu masz dodać pozycję, ale... dodałeś do listy pozycji katalog, który w środku ma własną listę pozycji? Nie brzmi to dla Ciebie dziwnie? W katalogu książek nie masz listy kolejnych katalogów, masz listę książek.

Na pewno Pozycja jest klasą abstrakcyjną? Nie ma żadnej klasy Książka ani nic takiego?

W każdym razie...

Console.WriteLine(pozycja);

No tak, bo teraz po prostu wypisujesz obiekt (jeśli nie ma przeładowanego ToString, to dokładnie do się pokaże). Musisz wypisać zawartość tego obiektu, więc albo wypisując jego pola, albo wywołując na nim jakąś metodę.

komentarz 21 grudnia 2020 przez kuba412 Początkujący (310 p.)
Tak, jest też klasa książka, czy czasopismo, jednak według zadania abstrakcyjna ma być pozycja. i rzeczywiście nie powinno dziedziczyć, a korzystać z asocjacji, za chwilę to naprawię. Dodałem przeładowanie i teraz działa, bardzo dziękuję.
komentarz 21 grudnia 2020 przez kuba412 Początkujący (310 p.)

@adrian17, jeśli chodzi o to :

    Pozycja pozycja = new Katalog()

to też wydaje mi się to dziwne, jednak gdy zamiast katalog dodawałem Pozycja to wyświetlał się komunikat, że "nie można stworzyć obiektu klasy abstrakcyjnej lub interfejsu" i coś takiego znalazłem gdzieś w poradnikach.

komentarz 21 grudnia 2020 przez adrian17 Ekspert (344,860 p.)

jednak gdy zamiast katalog dodawałem Pozycja

I ma rację, bo o to właśnie chodzi z klasą abstrakcyjną, że nie możesz jej tworzyć.

Ale jak masz funkcję o nazwie "dodaj pozycję do katalogu" to znacznie więcej sensu jest dodać do katalogu książkę lub czasopismo niż katalog.

Podobne pytania

0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 18 listopada 2020 w Java przez Szox Nowicjusz (230 p.)
+2 głosów
2 odpowiedzi 717 wizyt
0 głosów
1 odpowiedź 229 wizyt
pytanie zadane 21 sierpnia 2019 w C# przez noname3 Obywatel (1,180 p.)

92,558 zapytań

141,407 odpowiedzi

319,569 komentarzy

61,945 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...