2 svar
641 visningar
bloodborne är nöjd med hjälpen
bloodborne 3 – Fd. Medlem
Postad: 2 jul 2021 15:34 Redigerad: 2 jul 2021 15:39

Lägga till klass som hanterar en bokhylla

Hej! Har lite problem med en uppgift i Programmering 2.

Först har jag skrivit en Bokhylla där man kan lägga till böcker, visa alla tillagda böcker osv.

Vi har jobbat en del med klassbegreppet och därmed finns böckerna i tre olika subklasser.

 

Nu är tanken att vi ska skapa en egen klass som ska vara en Bibliotekarie åt den här Bokhyllan.

Jag har bara svårt att förstå vad det är som ska hända, för jag förstår inte riktigt hur en klass kontrollerar andra klasser med metoder. Är det nödvändigt mer än att man sparar in på kod? Känner bara att det dyker upp så mycket frågor.

 

Här är koden till Bokhyllan:

 

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;
using System.Text;

namespace BokHyllan
{
    public class Bok       // skapar Bok-klassen
    {
        public string Titel;
        public string Skribent;
        public int Årtal;
        public string Typ;

        public Bok(string indataTitel, string indataSkribent, int indataÅrtal) // kopieringskonstruktor för bokklassen
        {
            Titel = indataTitel;                            // egenskaper 
            Skribent = indataSkribent;
            Årtal = indataÅrtal;
        }
    }
    public class Tidskrift : Bok           // Underklass Tidskrift
    {
        public Tidskrift(string indataTitel, string indataSkribent, int indataÅrtal) : base(indataTitel, indataSkribent, indataÅrtal)
        {

            Typ = "Tidskrift";      // ändring av 
        }
    }
    public class Roman : Bok               // Underklass Roman
    {
        public Roman(string indataTitel, string indataSkribent, int indataÅrtal) : base(indataTitel, indataSkribent, indataÅrtal)
        {
            Typ = "Roman";
        }
    }
    public class Novellsamling : Bok       // Underklass Novellsamling
    {
        public Novellsamling(string indataTitel, string indataSkribent, int indataÅrtal) : base(indataTitel, indataSkribent, indataÅrtal)
        {
            Typ = "Novellsamling";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            bool isRunning = true;
            List<Bok> bokHylla = new List<Bok>();    // Lista som tar emot Bok-klassen

            while (isRunning)
            {

                Console.Clear();
                Console.WriteLine("\n\t** Välkommen till Bokhyllan **");
                Console.WriteLine("\n\t[1] Registrera en ny bok");
                Console.WriteLine("\n\t[2] Visa alla böcker");
                Console.WriteLine("\n\t[3] Avsluta");



                if (Int32.TryParse(Console.ReadLine(), out int menyVal))

                {
                    switch (menyVal)
                    {
                        case 1:                                 // lägger till ny bok

                            Console.Clear();
                            Console.WriteLine("\n\tAnge titel: ");
                            Console.WriteLine("\n\t");
                            string indataTitel = Console.ReadLine();
                            Console.WriteLine("\n\tAnge författare: ");
                            Console.WriteLine("\n\t");
                            string indataSkribent = Console.ReadLine();
                            Console.WriteLine("\n\tAnge årtal: ");
                            Console.WriteLine("\n\t");
                            string strÅrtal = Console.ReadLine();
                            int indataÅrtal = Convert.ToInt32(strÅrtal);

                            Console.Clear();
                            Console.WriteLine("\n\tAnge boktyp: ");

                            Console.WriteLine(
                                "\n\tVälj en boktyp: " +
                                "\n\t[1] Tidskrift " +
                                "\n\t[2] Roman " +
                                "\n\t[3] Novellsamling"
                                );

                            if (Int32.TryParse(Console.ReadLine(), out int typVal))  // felhantering inmatning val av boktyp
                            {
                                if (typVal == 1)
                                {

                                    Tidskrift nyTidskrift = new Tidskrift(indataTitel, indataSkribent, indataÅrtal);    // skapar ett nytt objekt av underklassen Tidskrift
                                    bokHylla.Add(nyTidskrift);


                                    Console.Clear();

                                    Console.WriteLine("\n\tTitel: "
                                        + indataTitel);
                                    Console.WriteLine("\n\tFörfattare: "
                                        + indataSkribent);
                                    Console.WriteLine("\n\tÅrtal: "
                                        + indataÅrtal);
                                    Console.WriteLine("\n\tTyp: "
                                        + nyTidskrift.Typ);

                                }
                                else if (typVal == 2)
                                {
                                    Roman nyRoman = new Roman(indataTitel, indataSkribent, indataÅrtal);        // skapar nytt objekt av underklassen Roman
                                    bokHylla.Add(nyRoman);

                                    Console.Clear();

                                    Console.WriteLine("\n\tTitel: "
                                        + indataTitel);
                                    Console.WriteLine("\n\tFörfattare: "
                                        + indataSkribent);
                                    Console.WriteLine("\n\tÅrtal: "
                                        + indataÅrtal);
                                    Console.WriteLine("\n\tTyp: "
                                        + nyRoman.Typ);
                                }
                                else if (typVal == 3)
                                {
                                    Novellsamling nyNovell = new Novellsamling(indataTitel, indataSkribent, indataÅrtal);       // skapar nytt objekt av underklassen Novellsamling
                                    bokHylla.Add(nyNovell);

                                    Console.Clear();

                                    Console.WriteLine("\n\tTitel: "
                                        + indataTitel);
                                    Console.WriteLine("\n\tFörfattare: "
                                        + indataSkribent);
                                    Console.WriteLine("\n\tÅrtal: "
                                        + indataÅrtal);
                                    Console.WriteLine("\n\tTyp: "
                                        + nyNovell.Typ);


                                }
                            }
                            else
                            {
                                Console.WriteLine("Du måste skriva en siffra 1-3.");
                                Console.ReadLine();
                            }


                            Console.ReadLine();


                            break;

                        case 2:                                 // visar alla böcker

                            Console.Clear();

                            foreach (Bok item in bokHylla)      // för varje Bok-objekt i bokHylla, skriv ut egenskaper
                            {
                                Console.WriteLine("\n\tTitel: "
                                    + item.Titel);
                                Console.WriteLine("\n\tFörfattare: "
                                    + item.Skribent);
                                Console.WriteLine("\n\tÅrtal: "
                                    + item.Årtal);
                                Console.WriteLine("\n\tTyp: "
                                    + item.Typ + "\n\t");

                                Console.WriteLine("\n\t**\n\t");        // ger mellanrum mellan objekten i utskriften
                            }
                            Console.ReadLine();
                            break;

                        case 3:                                         // avslutar bokhyllan
                            Console.WriteLine("Avslutar...");
                            Console.ReadLine();

                            isRunning = false;
                            break;
                    }
                }
                else
                {
                    Console.WriteLine("Felaktig inmatning! Du måste skriva ett heltal 1-3.");
                    Console.ReadLine();
                }
            }
        }
    }
}

 

Så, tanken är sedan att vi alltså ska skriva en klass, "Bibliotekarie". Den ska hantera Bokhyllan genom metoder.
Här är beskrivningen av övningsuppgiften:

"- Du ska skriva en ny Bibliotekarieklass, som ska innehålla ditt programs lista med Böcker (Bokhyllan). Bibliotekarien är den som kontrollerar listan med böcker. Den här listan ska vara private, och användaren ska interagera med listan genom metoder.


- Bibliotekarieklassen ska ha minst tre metoder. En metod för att lägga till böcker i listan (Bokhyllan), en för att skriva ut alla böcker från listan (Bokhyllan) och möjligheten att söka bland böcker (i Bokhyllan). 

- Varje underklass (tidskrift, roman, novellsamling, etc.) ska ha en egen ToString-override som ska användas vid utskrift av boken. Den här metoden ska ge olika meddelanden baserat på vilken underklass det är. Du kan exempelvis skriva ut ett meddelande om vilken avdelning boken finns i, baserat på vilken sorts underklass det är. "Tidskrifter finns i tidningshyllan".
När användaren skriver ut samtliga böcker ska ToString-metoden kallas, exempelvis med:
foreach (Bok objekt in bokLista)

{

    Console.WriteLine(objekt);

}"

Om någon snäll själ bara skulle kunna förklara hur man gör detta så vore jag ytterst tacksam.

Skriva en klass är inget problem på det sättet, men det blev lite knasigt när man skall lägga till metoder och använda inkapsling, jag provade lite olika sätt att göra det på, t.ex att skapa en klass som en separat fil, men jag stöter på problem när jag försöker skapa metoder i den nya "Bibliotekarie"-klassen.

Jag hoppas jag förklarar tydligt nog vad det är jag behöver hjälp med!

Tack på förhand.

Mega7853 211
Postad: 6 jul 2021 16:31

Jag förstår inte exakt vad du har problem med, men här är några tips:

* Du behöver inte skriva en klass per fil (även om det kan vara bra att strukturera din kod). Inkapsling handlar om att "gömma" saker inuti en klass, t.ex. att bok-listan är private inuti bibliotekarie-klassen.
* Metoder är helt enkelt funktioner som du skriver inuti klassen, som du redan gjort med konstruktorn Bok()
* Du har redan skrivit en del kod för att hantera bok-listan. Stoppa in den koden i metoder i bibliotekarie-klassen och kalla sedan på de metoderna istället. T.ex. en del av koden i "case 1" kan du stoppa in i en metod LäggTillBok(Bok nyBok) eller (kanske bättre) LäggTillBok(string indataTitel, string indataSkribent, int indataÅrtal) så slipper du skapa ett Bok-objekt som du inte har nytta av.
* När du är klar med metoderna, skapa ett bibliotekarie-objekt istället för bok-listan i main() och i casen kallar du på metoderna i objektet.

 

Du kan också göra en minimal ändring i taget och testa efter varje för att se om det fungerar. Skapa en bibliotekarie-klass med en public bok-lista och låt din kod i main() arbeta på den istället. Flytta sedan över en liten del av koden i main() i taget till metoder. Lägg gärna till console.log() i metoderna så att du förstår när de kallas.

bloodborne 3 – Fd. Medlem
Postad: 7 jul 2021 13:52
Mega7853 skrev:

Jag förstår inte exakt vad du har problem med, men här är några tips:

* Du behöver inte skriva en klass per fil (även om det kan vara bra att strukturera din kod). Inkapsling handlar om att "gömma" saker inuti en klass, t.ex. att bok-listan är private inuti bibliotekarie-klassen.
* Metoder är helt enkelt funktioner som du skriver inuti klassen, som du redan gjort med konstruktorn Bok()
* Du har redan skrivit en del kod för att hantera bok-listan. Stoppa in den koden i metoder i bibliotekarie-klassen och kalla sedan på de metoderna istället. T.ex. en del av koden i "case 1" kan du stoppa in i en metod LäggTillBok(Bok nyBok) eller (kanske bättre) LäggTillBok(string indataTitel, string indataSkribent, int indataÅrtal) så slipper du skapa ett Bok-objekt som du inte har nytta av.
* När du är klar med metoderna, skapa ett bibliotekarie-objekt istället för bok-listan i main() och i casen kallar du på metoderna i objektet.

 

Du kan också göra en minimal ändring i taget och testa efter varje för att se om det fungerar. Skapa en bibliotekarie-klass med en public bok-lista och låt din kod i main() arbeta på den istället. Flytta sedan över en liten del av koden i main() i taget till metoder. Lägg gärna till console.log() i metoderna så att du förstår när de kallas.

Tack så mycket för svar, jag får testa mig fram lite med det du skrev :)

Svara Avbryt
Close