Hur kallar jag en public metod med privata variabler? C#

Permalänk

Hur kallar jag en public metod med privata variabler? C#

Hur kallar jag en public metod med privata variabler ifrån klassen Dog?
Variablerna behöver vara privata enligt C# boken jag läser.
Har försökt att förstå om vad som behöver göras för att få det att fungera men utan framgång.

Det är metoderna Dog.Bark(); och Dog.Fetch(); som jag vill ska kunna fungera.

Uppskattar alla synpunkter och tips.

class Program { static void Main(string[] args) { Dog name = new Dog(); name.Name = "Torvi"; Dog race = new Dog(); race.Race= "Siberian Husky"; Dog age = new Dog(); age.Age = 3; Console.WriteLine(name.Name + " is a " + race.Race + " and is " + age.Age + " years old."); Dog.Bark(); } class Dog { private string name; private string race; private double age; public void Bark() { if (age < 1) { Console.WriteLine(name + " can not bark because it is a small puppy."); } else { Console.WriteLine(name + " barks: WOFF WOFF!"); } } public void Fetch() { if (age > 15) { Console.WriteLine(name + " is " + age + " years old and cannot retrieve the ball. "); } else { Console.WriteLine(name + " runs after the ball and drops it at your feet."); } } public string Name { get { return name; } set { name = value; } } public string Race { get { return race; } set { race = value; } } public double Age { get { return age; } set { age = value; }

Permalänk
Medlem

Dog name = new Dog(); name.Name = "Torvi"; Dog race = new Dog(); race.Race= "Siberian Husky"; Dog age = new Dog(); age.Age = 3;

Du skapar tre stycken hundar. Varje gång du gör 'new Dog()' får du en ny hund. Den första ger du ett namn, den andra en ras och den tredje en ålder.

Sen när du anropar Bark så använder du klassen Dog istället för den instans av du skapat och givit värden.

Gör såhär istället:

var dog = new Dog(); dog.Name = "Torvi"; dog.Race= "Siberian Husky"; dog.Age = 3; dog.Bark()

Visa signatur

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

Permalänk
Medlem

(Jag kan inte C# så bra, så ta ej detta som en absolut sanning, men prova gärna.)

I Main() så skapar (instantierar) du nu tre olika Dog med variabelnamn name, race och age. Det ser ut som att du bara behöver en Dog, så kör t.ex. Dog my_dog = new Dog(). Ta bort övriga instanser, dvs Dog name = new Dog(), Dog race = new Dog() och dog age = new Dog().

Döp din hund: my_dog.Name = "Torvi";
Sätt hundras: my_dog.Race = "Siberian Husky";
Ange ålder: my_dog.Age = 3;

Sedan använder du my_dog överallt istället, dvs

Console.WriteLine(my_dog.Name + " is a " + my_dog.Race + " and is " + my_dog.Age + " years old."); my_dog.Bark();

Permalänk
Medlem

Gör som i svaret ovan. Och om ni i senare övningar ska ha många hundar så skapa dog1, dog2 etc och sätt dog1.name, dog2.name. ja du fattar.

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk

Det fungerade utan problem. Konstigt nog hade inte boken nämnt om referensen "var".

Tackar så hjärtligt!

Permalänk
Medlem

https://www.pluralsight.com/guides/understanding-scope-and-vi...

Där kan du läsa mer om hur variabler sparas och syns för andra funktioner och klasser. Tydliga exempel på alla nivåer.

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Medlem
Skrivet av LordStimpa:

Det fungerade utan problem. Konstigt nog hade inte boken nämnt om referensen "var".

Tackar så hjärtligt!

Du hade kunnat skriva

Dog dog = new Dog();

I det fallet är du specifik i vilken typ du förväntar dig att 'dog' kommer vara.
'var' känner av vilken typ som 'new Dog()' skapar så du behöver inte specificera det själv.

Båda sätten får i det här fallet samma resultat. 'var' är enklare att jobba med.

Visa signatur

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

Permalänk
Skrivet av talonmas:

https://www.pluralsight.com/guides/understanding-scope-and-vi...

Där kan du läsa mer om hur variabler sparas och syns för andra funktioner och klasser. Tydliga exempel på alla nivåer.

Tack! Ska läsa på om detta så att det sitter.

Permalänk
Skrivet av Anaii:

Du hade kunnat skriva

Dog dog = new Dog();

I det fallet är du specifik i vilken typ du förväntar dig att 'dog' kommer vara.
'var' känner av vilken typ som 'new Dog()' skapar så du behöver inte specificera det själv.

Båda sätten får i det här fallet samma resultat. 'var' är enklare att jobba med.

Aha, ifall jag hade exempelvis kodat enligt följande:

Dog dog = new Dog();

Så hade jag behövt deklarera vilken typ av variabel som ska lagras i 'dog'.
Men nu när jag använder 'var' så behöver jag inte göra det eftersom att den känner av det.
Om jag förstår dig rätt.

Permalänk
Medlem

Om man använder VAR för att deklarera objekt så gissar kompilatorn vad det ska vara baserat på det som är till höger om likamedtecknet.

Anledningen att du inte lärt dig det är för att du lär dig grunderna. Då är det viktigt att veta vilken datatyp man deklarerar. VAR är det lata sättet att göra det på

Finns mycket kritik mot att använda det också för det kan göra det svårare att läsa för andra. Själv använder jag det där jag tycker det är tydligt vad som skapas.

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Medlem

Finns andra anledningar än lathet att använda VAR. Exempelvis behöver du inte skriva koden om du tex ersätter Dog med en ny typ som ärver eller extendar Dog.
Sen finns det tillfällen man inte kan använda var:

Dog dog; //if statements or something dog = new Dog();

Men nu är vi inne djupare än ursprungliga uppgiften

Visa signatur

He who hasn't hacked assembly language as a youth has no heart. He who does so as an adult has no brain.
~John Moore

Permalänk
Medlem
Skrivet av Anaii:

Finns andra anledningar än lathet att använda VAR. Exempelvis behöver du inte skriva koden om du tex ersätter Dog med en ny typ som ärver eller extendar Dog.
Sen finns det tillfällen man inte kan använda var:

Dog dog; //if statements or something dog = new Dog();

Men nu är vi inne djupare än ursprungliga uppgiften

Jag skulle säga att det är okej att använda var när det är tydligt vilken typ som deklareras.

// Tydligt var dog = new Dog(); // Otydligt var dog = someMethod();

Men det är som sagt off topic.

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 talonmas:

Om man använder VAR för att deklarera objekt så gissar kompilatorn vad det ska vara baserat på det som är till höger om likamedtecknet.

Anledningen att du inte lärt dig det är för att du lär dig grunderna. Då är det viktigt att veta vilken datatyp man deklarerar. VAR är det lata sättet att göra det på

Finns mycket kritik mot att använda det också för det kan göra det svårare att läsa för andra. Själv använder jag det där jag tycker det är tydligt vad som skapas.

Skrivet av noMad17:

Jag skulle säga att det är okej att använda var när det är tydligt vilken typ som deklareras.

// Tydligt var dog = new Dog(); // Otydligt var dog = someMethod();

Men det är som sagt off topic.

Det är faktiskt enligt Microsofts kodstandard att användavar istället för att specifikt ange vilken typ som variabeln avser - förutsatt att det är tydligt vilken typ som deklareras enligt högersidan av likamedtecknet, precis som @noMad17 visar i sitt exempel

Skrivet av LordStimpa:

Aha, ifall jag hade exempelvis kodat enligt följande:

Dog dog = new Dog();

Så hade jag behövt deklarera vilken typ av variabel som ska lagras i 'dog'.
Men nu när jag använder 'var' så behöver jag inte göra det eftersom att den känner av det.
Om jag förstår dig rätt.

Använd inte var om du inte känner dig helt säker med kodningen ännu. Att ange vilken typ du avser är mycket bättre för att få dig att förstå vad du kodar.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem
Skrivet av Pamudas:

Det är faktiskt enligt Microsofts kodstandard att användavar istället för att...

Om de bara själva följde den så kanske fler skulle bry sig om den
T.ex. metoder med stort namn, men skapa en per automatik i visual studio och du får med liten bokstav, typ button1_Click().

Visa signatur

Processor: Motorola 68000 | Klockfrekvens: 7,09 Mhz (PAL) | Minne: 256 kB ROM / 512 kB RAM | Bussbredd: 24 bit | Joystick: Tac2 | Operativsystem: Amiga OS 1.3

Permalänk
Medlem
Skrivet av talonmas:

Om de bara själva följde den så kanske fler skulle bry sig om den
T.ex. metoder med stort namn, men skapa en per automatik i visual studio och du får med liten bokstav, typ button1_Click().

Fast det är ju p.g.a. knappen heter button1 och inte Button1

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Hedersmedlem
Skrivet av talonmas:

Finns mycket kritik mot att använda det också för det kan göra det svårare att läsa för andra. Själv använder jag det där jag tycker det är tydligt vad som skapas.

Numera har man ju dessutom alternativet

Dog dog = new();

att välja på.