Video 18: enkelt spørgsmål

Her kan du diskutere opgaverne til C# serien og evt. dele dine egne løsningsforslag med andre.
Besvar
Nico86dk
Begynder
Indlæg:6
Tilmeldt:28. jul 2016, 15:20
Video 18: enkelt spørgsmål

Indlæg af Nico86dk » 1. aug 2016, 12:50

Jeg har lavet alle opgaverne til denne video og har derfor et spørgsmål jeg gerne vil have afklaret (set og get er først ved at hænge lidt fast nu).
Jeg har lavet denne bog klasse:

private String favoritBog;

public void SetfavoritBog(String favoritBog)
{
this.favoritBog = favoritBog;
}

public String GetfavoritBog()
{
return favoritBog;
}

public void PrintBogInfo()
{
Console.WriteLine("Favorit bog: " + GetfavoritBog());
//Console.WriteLine("Favorit bog: " + favoritBog)
Console.ReadLine();
}


I opgave 6 hvor man skal lave den metode til PrintInfoBook hvad er forskellen på om man skriver GetfavoritBog() eller favoritBog? Jeg får 100% samme resultat når jeg tester uanset om jeg skriver det ene eller andet.

jepperask
Geni
Geni
Indlæg:378
Tilmeldt:4. nov 2012, 17:57

Re: Video 18: enkelt spørgsmål

Indlæg af jepperask » 2. aug 2016, 20:45

Nico86dk skrev: I opgave 6 hvor man skal lave den metode til PrintInfoBook hvad er forskellen på om man skriver GetfavoritBog() eller favoritBog? Jeg får 100% samme resultat når jeg tester uanset om jeg skriver det ene eller andet.
Da du foretager kaldet inde i klassen selv, er der ingen forskel. Feltet har du gjort 'private', hvilket vil sige det kun kan ses af klassen selv. Havde du derimod lavet en konstruktør, instanstieret et objekt af denne type i en anden klasse og forsøgt at kalde feltet direkte, vil du få en fejl - men ikke med din getter, da den er public.

For at løse dette, kunne du så gøre dit felt 'public', og så ville begge ting igen returnere det samme, uanset hvor du kalder det fra, men det er ikke anbefalet.

Det er (så vidt jeg har forstået) generelt anset som værende mere korrekt at deklarere felter private og lave getter/setter-metoder. Jeg tror eksempelvist grunden er, at hvis du en dag ændrer feltets variabel-type, så vil du muligvis(!) få fejl alle de steder hvor du har kaldet feltet direkte.
Hvis du derimod har lavet en getter, og besluttet dig for at uanset hvilken variabel du har med at gøre, så skal der i sidste ende trækkes en string ud af den (eksempelvis hvis dit private felt er en anden klasse), så behøver du kun rette det i klassen selv (i getter-metoden), og alle de steder i din kode hvor du er afhængig af hvad klassen returnerer, vil stadig fungere som ønsket. Samme gælder for setter-metoder, hvor du måske en dag får brug for at gøre mere ved din data, inden du 'sætter' værdien af det private felt til noget nyt - så skal det kun gøres i setteren, og ikke alle de steder hvor du ellers ville kalde "object.field = xxx;"

Jeg ved ikke helt hvordan man kan forklare det smart, men der er en række gode svar i den her tråd omkring det ellers:
http://stackoverflow.com/questions/1568 ... nd-setters

Nico86dk
Begynder
Indlæg:6
Tilmeldt:28. jul 2016, 15:20

Re: Video 18: enkelt spørgsmål

Indlæg af Nico86dk » 3. aug 2016, 10:40

Tak for svaret Jeppe. Jeg prøver stadig, at tyde svaret for 100% mening, men tror jeg er nogenlunde med på hvad du mener.
Sådan som jeg har skrevet koden er det fulgt 100% som det er anvist i videoer, så jeg satser ikke på at der er lavet nogle fejl.
I min Main har jeg følgende kode:

static void Main(string[] args)
{
Person batman = new Person(); // Objektet Person laves med ref.variabel batman.

// Opg 4 & 5
Bog sherlockHolmes = new Bog();


// Opg 3

batman.Setnavn("Bruce Vayne");
batman.Setalder(30);
batman.Setpenge(9999999999);

batman.PrintInfo();

// Opg 4, 5 & 6

sherlockHolmes.SetfavoritBog("Sherlock Holmes - Nattens Skygger");
sherlockHolmes.PrintBogInfo();
}

Er der noget jeg kunne have gjort anderledes, eller er tingene nu bare en gang som jeg beskrev i først indlæg?

På forhånd tak. :)

jepperask
Geni
Geni
Indlæg:378
Tilmeldt:4. nov 2012, 17:57

Re: Video 18: enkelt spørgsmål

Indlæg af jepperask » 3. aug 2016, 12:23

Jeg har lige kigget på opgaverne, og jeg tror lige du skal kigge lidt mere på det.

I sidste ende tror jeg du skal ende ud med 2 klasser, hhv. Book og Person.

I din Person-klasse, skal der udover alder, navn og pengebeholdning være et felt der hedder favoriteBook, som skal være af typen Book (øvelse 4 - rigtig vigtigt) - tænk på, at en person har en yndlingsbog.

Nu vil jeg ikke give dig hele svaret, men skriv hvis det giver problemer. :)

Nico86dk
Begynder
Indlæg:6
Tilmeldt:28. jul 2016, 15:20

Re: Video 18: enkelt spørgsmål

Indlæg af Nico86dk » 3. aug 2016, 17:27

Så har jeg kigget på opgaverne igen, og har fulgt videoen slavisk - har vist givet nogle lidt andre navn men det er vel underordner?!
Er jeg stadig helt fra den eller ser det mere fornuftigt ud?
Således ser mit program.cs ud:
namespace Video18_ReferncerVersion2
{
class Program
{
static void Main(string[] args)
{

Person batman = new Person();

batman.Setnavn("Bruce Vayne");
batman.Setalder(30);
batman.Setpenge(9999999999);

batman.PrintInfo();

Bog favoritBog = new Bog();
favoritBog.Settitle("Sherlock");

batman.SetsBog(favoritBog);
batman.PrintBogInfo();
}
}
}
Person klasse:
namespace Video18_ReferencerVersion2
{
class Person
{
private String navn;
private int alder;
private double penge;
Bog yndlingsBog;

public void Setnavn(String navn)
{
this.navn = navn;
}

public String Getnavn()
{
return navn;
}

public void Setalder(int alder)
{
this.alder = alder;
}

public int Getalder()
{
return alder;
}

public void Setpenge(double penge)
{
this.penge = penge;
}

public double Getpenge()
{
return penge;
}

public void SetsBog(Bog yndlingsBog)
{
this.yndlingsBog = yndlingsBog;
}

public Bog GetyndlingsBog()
{
return yndlingsBog;
}
public void PrintInfo()
{
Console.WriteLine("[Personinformation]:");
Console.WriteLine("Navn: " + navn);
Console.WriteLine("Alder: " + alder);
Console.WriteLine("Penge til rådighed: " + penge + "kr.");

}

public void PrintBogInfo()
{
if (yndlingsBog != null)
Console.WriteLine("Favoritbogen er: " + yndlingsBog.Gettitle());
else
Console.WriteLine("Ingen favoritbog!");
}
}
}
og bog klassen:
namespace Video18_ReferncerVersion2
{
class Bog
{
private String title;

public void Settitle(String title)
{
this.title = title;
}

public String Gettitle()
{
return title;
}
}
}

jepperask
Geni
Geni
Indlæg:378
Tilmeldt:4. nov 2012, 17:57

Re: Video 18: enkelt spørgsmål

Indlæg af jepperask » 3. aug 2016, 17:39

Nico86dk skrev:Så har jeg kigget på opgaverne igen, og har fulgt videoen slavisk - har vist givet nogle lidt andre navn men det er vel underordner?!
Er jeg stadig helt fra den eller ser det mere fornuftigt ud?
Det ser rigtigt ud, idét:

Kode: Vælg alt

batman.SetsBog(favoritBog);
.. sætter feltet 'yndlingsBog' til at være lig den oprettede bog. Før havde du lavet det som en string, hvilket ikke kan særlig meget - men nu, har du istedet en reference til dét objekt i hukommelsen som du har oprettet her:

Kode: Vælg alt

Bog favoritBog = new Bog();
favoritBog.Settitle("Sherlock");
Det betyder også, at hvis dette objekt er refereret til andre steder (hvis 5 personer f.eks har denne bog som yndlingsbog), så vil fremtidige ændringer i dét bog-objekt gå igen alle 5 steder, fremfor at du skal ind og opdatere 5 strings.. hvis det giver mening?

OBS: Når du for fremtiden indsætter kode her på siden, så benyt den knap der hedder "Code" og indsæt din kode mellem de 2 'klammer': [ code] kode her.. [ /code]

Nico86dk
Begynder
Indlæg:6
Tilmeldt:28. jul 2016, 15:20

Re: Video 18: enkelt spørgsmål

Indlæg af Nico86dk » 4. aug 2016, 13:19

Mange tak for responsen og for at guide mig i den rigtige retning. Det lykkedes til sidst, at få det at fungere.

Skal nok huske at bruge kodeknappen fremover, det er en tanketorsk af mig da jeg ikke er så kendt i disse kredse. :)

Besvar