• 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

VPS Starter Arubacloud
0 głosów
106 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,100 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,100 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,100 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ź 137 wizyt
pytanie zadane 18 listopada 2020 w Java przez Szox Nowicjusz (230 p.)
+2 głosów
2 odpowiedzi 699 wizyt
0 głosów
1 odpowiedź 219 wizyt
pytanie zadane 21 sierpnia 2019 w C# przez noname3 Obywatel (1,180 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...