Permalänk

C# Metod, class, arv

Hej.
Jobbar på ett "Bokhylleprogram" och vet inte hur jag ska ta mig vidare.
Programmet ger en krasch och refererar till get; set; koderna samt att jag lyckas inte få fram böckerna i case 2.
Någon som har lite råd till mig?
Är ganska ny på programmering så kanske något enkelt för den som är lite insatt.
Mvh

internal class Program
{
class Bok
{
public Bok(string Titel, string Författare, int Utgivning, string Genre)
{ }
public string Titel
{
get { return Titel; }
set { Titel = value; }
}
public string Författare
{
get { return Författare; }
set { Författare = value; }
}
public int Utgivning
{
get { return Utgivning; }
set { Utgivning = value; }
}
public string Genre;
{ get { return Genre; }
set { Genre = value; }
}

}
class Roman : Bok
{
public Roman(string Titel, string Författare, int Utgivning, string Genre)
: base(Titel, Författare, Utgivning, Genre)
{
Genre = "Roman";
}
}
class Tidsskrift : Bok
{
public Tidsskrift(string Titel, string Författare, int Utgivning, string Genre)
: base(Titel, Författare, Utgivning, Genre)
{
Genre = "Tidsskrift";
}
}
class Novellsamling : Bok
{
public Novellsamling(string Titel, string Författare, int Utgivning, string Genre)
: base(Titel, Författare, Utgivning, Genre)
{
Genre = "Novellsamling";
}
}
static void Main(string[] args)
{
bool menyBool = true;
List<Bok> BokHylla = new List<Bok>();
while (menyBool)
{
Console.Clear();
Console.WriteLine("\n\tVälkommen till Bokhyllan!");
Console.WriteLine("\n\t1) Registrera en ny bok.");
Console.WriteLine("\n\t2) Visa befinliga böcker.");
Console.WriteLine("\n\t3) Avsluta Program.");
// Sparar användarens val och förhindrar krasch.
Int32.TryParse(Console.ReadLine(), out int menyVal);
{
switch (menyVal)
{
case 1:
Console.Clear();
Console.WriteLine("\n\tAnge titel: ");
string _Titel = Console.ReadLine();
Console.WriteLine("\n\tAnge författare: ");
string _Författare = Console.ReadLine();
Console.WriteLine("\n\tAnge utgivningsår: ");
string utgivningsår = Console.ReadLine();
int _Utgivning = Convert.ToInt32(utgivningsår);
Console.WriteLine("\n\tVälj en bokgenre: " +
"\n\t1) Roman " + "\n\t2) Tidskrift " +
"\n\t3) Novellsamling ");
if (Int32.TryParse(Console.ReadLine(), out int genreVal))
{
if (genreVal == 1)
{ Roman nyRoman = new Roman
(_Titel, _Författare, _Utgivning, "Genre: Roman");

Console.WriteLine("\n\tTitel: " + _Titel);
Console.WriteLine("\n\tFörfattare: " + _Författare);
Console.WriteLine("\n\tUtgivningsdatum " + _Utgivning);
Console.WriteLine("\n\tGenre: Roman " + nyRoman.Genre);
BokHylla.Add(nyRoman);
}
else if (genreVal == 2)
{
Tidsskrift nyTidskrift = new Tidsskrift
(_Titel, _Författare, _Utgivning, "Genre: Tidsskrift");

Console.WriteLine("\n\tTitel: " + _Titel);
Console.WriteLine("\n\tFörfattare: " + _Författare);
Console.WriteLine("\n\tUtgivningsdatum: " + _Utgivning);
Console.WriteLine("\n\tTyp:Tidsskrift " + nyTidskrift.Genre);
BokHylla.Add(nyTidskrift);
}
else if (genreVal == 3)
{
Novellsamling nyNovell = new Novellsamling
(_Titel, _Författare, _Utgivning, "Genre: Novell");

Console.WriteLine("\n\tTitel: " + _Titel);
Console.WriteLine("\n\tFörfattare: " + _Författare);
Console.WriteLine("\n\tUtgivningsdatum: " + _Utgivning);
Console.WriteLine("\n\tGenre: Novell" + nyNovell.Genre);
BokHylla.Add(nyNovell);
}
}
else
{
Console.WriteLine("Välj siffra 1, 2 eller 3.");
Thread.Sleep(2000);
}
Console.ReadLine();
break;
case 2:
foreach (Bok item in BokHylla)
if (item == null)
{
Console.WriteLine("Det finns inga böcker registrerade");
}
else
{
Console.WriteLine("\n\tTitel: " + item.Titel);
Console.WriteLine("\n\tFörfattare: " + item.Författare);
Console.WriteLine("\n\tÅrtal: " + item.Utgivning);
Console.WriteLine("\n\tGenre: " + item.Genre + "\n\t");
}
Console.ReadLine();
break;
case 3:
{
Console.WriteLine("Tack för denna gång!");
Thread.Sleep(3000);
menyBool = false;
}
break;
default:
{
Console.WriteLine("Välj ett menyval 1, 2 eller 3.");
Thread.Sleep(2000);
}
break;
}}}}}}

Permalänk
Inaktiv

Boxa in det i code taggar

Permalänk
Hedersmedlem
Citat:

public string Titel { get { return Titel; } set { Titel = value; } }

Här blir det nog problem om man försöker hämta Titel då den refererar till sig själv. Det du vill ha är troligen

public string Titel { get; set; }

Eller (om du av någon anledning har behov av spara värdet i en egen variabel)

string titel; public string Titel { get { return titel; } set { titel = value; } }

Permalänk
Medlem

Det Elgot säger är definitivt en sak, programmet kommer rekursivt försöka ta ut värdet på propertyn tills dess stacken blir full.

En annan sak gissar jag är

public Bok(string Titel, string Författare, int Utgivning, string Genre) { }

Iom att du använder dig av denna konstruktor i subklasserna är det nog en bra idé att faktiskt implementera den (dvs göra något med parametrarna). Mitt förslag är även att parametrarna har inledande gemener, så heter de annorlunda än motsvarande properties och man kan helt enkelt göra

Titel = titel;

istället för att hålla på med "this.Titel = Titel"

public string Genre; { get { return Genre; } set { Genre = value; } }

semikolonet på första raden här ska bort (och som överallt annars, get är rekursiv och det behöver du fixa på alla ställen)

Gissar även att du inte tog med ex. namespacedeklaration eftersom det är en avslutande } för mycket. Ingen stor sak förvisso.

Vad gäller att visa bokhyllan, dvs alternativ 2, skulle jag själv vara lite tydligare med hur loopen ser ut, dvs explicit lägga till { och } runt if-satsen. Kontrollen för en tom bokhylla är troligen inte så som du antar eller vill att den ska vara. Istället för att loopa igenom listan Bokhylla och skriva ut att en bok som är null ger en tom bokhylla (analogt med att en bok som enbart är pärmarna i en bokhylla skulle göra bokhyllan tom?) skulle jag använda en kontroll med BokHylla.Any(), en metod returnerar true om listan innehåller element och false om den inte gör det.

if (BokHylla.Any()) { foreach (Bok item in BokHylla) { Console.WriteLine("\n\tTitel: " + item.Titel); Console.WriteLine("\n\tFörfattare: " + item.Författare); Console.WriteLine("\n\tÅrtal: " + item.Utgivning); Console.WriteLine("\n\tGenre: " + item.Genre + "\n\t"); } } else { Console.WriteLine("Det finns inga böcker registrerade"); }

Med ovan ändringar så får jag själv ihop något som fungerar hyfsat:

Ange titel: Fänrik Stål Ange författare: Johan Runeberg Ange utgivningsår: 1848 Välj en bokgenre: 1) Roman 2) Tidskrift 3) Novellsamling 1 Titel: Fänrik Stål Författare: Johan Runeberg Utgivningsdatum 1848 Genre: Roman Genre: Roman Välkommen till Bokhyllan! 1) Registrera en ny bok. 2) Visa befinliga böcker. 3) Avsluta Program. 2 Titel: Fänrik Stål Författare: Johan Runeberg Årtal: 1848 Genre: Genre: Roman

Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."

Permalänk

Tack för er tid och era råd!