Premiär! Fyndchans i SweClockers Månadens Drop

Hjälp med att skriva ut ett värde från en metod

Permalänk
Medlem

Hjälp med att skriva ut ett värde från en metod

Hallå på er kära vänner!

Jag som många andra läser Programmering 2 på distans och får själv sitta och googla och söka efter dom svaren man behöver utöver kurslitteraturen. Jag har en liten uppgift där jag bara har en sak kvar att göra. Tanken är att vi ska träna på arv osv inför en större uppgift senare.

Jag är väldigt ny till override metoder och dylikt och dessutom helt färsk när det kommer till arv och sånt men tror jag börjar fatta grejen. Uppgiften är kort; Gör en klass som heter Fordon, gör en ärvande klass som heter Lastbil och ge den olika saker att göra.

Det jag sitter fast på nu är att jag har en metod som heter "calc_topspeed" där jag bara gör en uträkning utgående ifrån hur mycket hästkrafter man gett lastbilen och hur mycket last den har. Vet inte om jag bara har hjärnsläpp eller vad det är men jag får inte till metoden så jag kan skriva ut det i min "toString" som jag har där jag ska skriva ut Hästkrafter, färg, last och tophastighet.

Det jag testat med är att lägga till:

public override string ToString() { return string.Format("Lastbilen har lastats med: {0} KG. \nFärgen på lastbilen är: {1}. \nHästkrafterna på lastbilen är: {2}. \nLastbilens tophastighet är: {3}", last, color, horsepower, topspeed); }

Men får då till svar att "topspeed" aldrig har tilldelats och därför stannar värdet på 0 även fast koden går igenom min calc_topspeed metod?

Hoppas ni kan hjälpa mig i rätt riktning, jag förväntar mig inte att ni gör det åt mig men har sett många bra svar på andra trådar i detta forum och jag hoppas jag kan få samma hjälp.

Här är min kod:

namespace Fordon { abstract class Fordon { protected int horsepower; protected string color; protected Fordon(int _horsepower, string _color) //basklassens konstruktor { horsepower = _horsepower; color = _color; } public virtual void horn() { Console.WriteLine("Tuut tuut"); } public virtual int calc_topspeed() { int topspeed; topspeed = horsepower + 10; return topspeed; } } class Lastbil : Fordon { private int last; private int topspeed; public Lastbil(int _horsepower, string _color, int _last) : base(_horsepower, _color) { Console.WriteLine("\nPlease enter desired horsepower of the truck!"); _horsepower = int.Parse(Console.ReadLine()); Console.WriteLine("\nWhat color is the truck?"); _color = Console.ReadLine(); Console.WriteLine("\nEnter the cargo of your truck here: "); _last = int.Parse(Console.ReadLine()); calc_topspeed(); horsepower = _horsepower; color = _color; last = _last; } public override int calc_topspeed() { int topspeed; topspeed = horsepower + (last / 4) * 2; return topspeed; } public override string ToString() { return string.Format("Lastbilen har lastats med: {0} KG. \nFärgen på lastbilen är: {1}. \nHästkrafterna på lastbilen är: {2}. \nLastbilens tophastighet är: {3}", last, color, horsepower, topspeed); } } class Program { public static void Main(string[] args) { Console.WriteLine("Welcome to this awesome truck simulator!"); Lastbil Volvo = new Lastbil(0, "", 0); Console.WriteLine(Volvo); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } }

Tack på förhand!!

Permalänk

Varför deklarerar du en int variabel i calc_topspeed? (detta frågar jag då jag inte är helt säker på vad du vill uppnå med koden)
Var ett tag sen jag programmerade i c++ men vill du inte assigna ett värde till klass-variabeln topspeed istället för en temporär variabel topspeed? Alltså this->topspeed = hors... istället för int topspeed = hors...

Permalänk
Medlem

Du gör aldrig något med returvärdet från calc_topspeed, så vad du i praktiken gör är att räkna ut värdet och sen slänga bort resultatet.

Din kod i konstruktor för Lastbil är för övrigt väldigt konstig. Varför har du inparametrar som du sen ignorerar värdet på och använder som lokala variabler? Lastbil borde i min åsikt inte sköta inläsning av inmatning från användaren, normalt sköter man sånt utanför klassen och skickar bara in värdena som parametrar till konstruktorn.

Permalänk
Medlem

För att förstå vad du faktiskt gjort fel så läs om scope och hur det fungerar.

Permalänk
Medlem

Som de andra säger så deklarerar du en helt ny variabel i din metod istället för att tilldela ett värde till din property.

I övrigt kan man ha synpunkter på vilket case du använder för variabler och metoder.
Din metod calc_topspeed är skriven i snake_case, men i C# är normen att privata metoder och variabler skrivs i camelCase, medan publika variabler och metoder skrivs i PascalCase. Alltså borde din metod snarare heta CalcTopSpeed.

Det kan tyckas vara petigt, men när du kommer ut i arbetslivet är det bra om du följer gängse kodstandard. Det underlättar när både du och andra ska läsa din kod då det snabbt går att se huruvida det rör sig om en publik eller privat metod/variabel.

Du bör heller inte blanda engelska och svenska i variabel- och metodnamn. Välj ett och håll dig till det.
Nu har du topspeed och last, vilka snarare borde vara endera topphastighet och last eller topSpeed och load.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem
Skrivet av Yunithium:

Varför deklarerar du en int variabel i calc_topspeed? (detta frågar jag då jag inte är helt säker på vad du vill uppnå med koden)
Var ett tag sen jag programmerade i c++ men vill du inte assigna ett värde till klass-variabeln topspeed istället för en temporär variabel topspeed? Alltså this->topspeed = hors... istället för int topspeed = hors...

Bra fråga såhär i efterhand. Plockat bort den int variabeln nu med bättre resultat. Tack!

Skrivet av perost:

Du gör aldrig något med returvärdet från calc_topspeed, så vad du i praktiken gör är att räkna ut värdet och sen slänga bort resultatet.

Din kod i konstruktor för Lastbil är för övrigt väldigt konstig. Varför har du inparametrar som du sen ignorerar värdet på och använder som lokala variabler? Lastbil borde i min åsikt inte sköta inläsning av inmatning från användaren, normalt sköter man sånt utanför klassen och skickar bara in värdena som parametrar till konstruktorn.

Jo märkte det, debuggade mig igenom steg för steg för att hitta vart det gick fel, detta är nu åtgärdat och jag har en kod som funkar som jag vill. Dock nämner du min kod i konstruktorn att den är tokig, började koda där inne och sen slutade det såhär, är tanken att jag ska lägga inläsning av inmatningen i Main-metoden kanske? Koden funkar ju som jag vill nu men man vill ju helst att den ska va "snygg" och lätt läsbar av andra också.

Skrivet av wargreymon:

För att förstå vad du faktiskt gjort fel så läs om scope och hur det fungerar.

Googlade om det och läste på lite om det, tack för tipset!

Skrivet av noMad17:

Som de andra säger så deklarerar du en helt ny variabel i din metod istället för att tilldela ett värde till din property.

I övrigt kan man ha synpunkter på vilket case du använder för variabler och metoder.
Din metod calc_topspeed är skriven i snake_case, men i C# är normen att privata metoder och variabler skrivs i camelCase, medan publika variabler och metoder skrivs i PascalCase. Alltså borde din metod snarare heta CalcTopSpeed.

Det kan tyckas vara petigt, men när du kommer ut i arbetslivet är det bra om du följer gängse kodstandard. Det underlättar när både du och andra ska läsa din kod då det snabbt går att se huruvida det rör sig om en publik eller privat metod/variabel.

Du bör heller inte blanda engelska och svenska i variabel- och metodnamn. Välj ett och håll dig till det.
Nu har du topspeed och last, vilka snarare borde vara endera topphastighet och last eller topSpeed och load.

Tack, plockade bort den variabeln och problemet löst. Jo jag kan förstå det, detta är ju via komvux jag fått uppgiften och där utgår jag ifrån ett UML för att tilldela variabler och klasser, det roliga är att man tjatar mycket om just det du säger om PascalCase, camelCase och snake_case men i uppgiften vill dom att man ska skriva så som jag gjorde (dessutom blanda svenska och engelska?) Men kan ju vara till min fördel att då strunta i deras namn och köra på mina egna helt på engelska och med rätt "case"! Tack.

Permalänk
Medlem
Skrivet av dabbezz:

Jo märkte det, debuggade mig igenom steg för steg för att hitta vart det gick fel, detta är nu åtgärdat och jag har en kod som funkar som jag vill. Dock nämner du min kod i konstruktorn att den är tokig, började koda där inne och sen slutade det såhär, är tanken att jag ska lägga inläsning av inmatningen i Main-metoden kanske? Koden funkar ju som jag vill nu men man vill ju helst att den ska va "snygg" och lätt läsbar av andra också.

Vanligtvis vill man inte ha saker som inläsning i konstruktorn, det gör det svårare att använda klassen. Nu kan du t.ex. inte skapa en Lastbil-instans med värden som du själv definierar direkt i koden, eller läsa in värden från en fil, etc. Så det är bättre att läsa in värdena direkt i Main eller i en separat metod och skicka in dessa till konstruktorn.

Skrivet av dabbezz:

Tack, plockade bort den variabeln och problemet löst. Jo jag kan förstå det, detta är ju via komvux jag fått uppgiften och där utgår jag ifrån ett UML för att tilldela variabler och klasser, det roliga är att man tjatar mycket om just det du säger om PascalCase, camelCase och snake_case men i uppgiften vill dom att man ska skriva så som jag gjorde (dessutom blanda svenska och engelska?) Men kan ju vara till min fördel att då strunta i deras namn och köra på mina egna helt på engelska och med rätt "case"! Tack.

Det är viktigt att vara konsekvent med sin namngivning, det gör koden lättare att förstå både för dig själv och andra. Något som är ännu viktigare är dock att göra som uppgiften säger Om uppgiften säger att du ska använda vissa namn så är det troligtvis bäst att göra det, även om det är "fel".