C# skoluppgift funderingar mot klasser

Permalänk
Medlem

C# skoluppgift funderingar mot klasser

Hej.
Jag går en intensiv kurs i programmering 1 och är helt ny med programmering. Jag håller på med ett projekt som heter Bussen och i den ska vi göra en buss som plockar upp passagerare. Den ska även kunna visa upp varje passagerare, beräkna den totala åldern och beräkna medelvärdet på åldern. Jag tänkte ha förbestämda passagerare som finns i en class som heter ThePassangers, sen ska då i classen Buss så ska den under add_passenger kunna dra slumpat ut från classen ThePassangers. Men jag vet inte hur jag ska ta mig dit, jag har gjort en kod och den är lite grötig kanske men jag har utgått till vad jag fått för information av min lärare.

Men smått och gott så är min fråga hur ska jag kunna dra classen ThePassangers metoden add_passangers in till add_passanger i Buss classen? eller borde jag skrota hela idén?

Mina kunskaper är väldigt låga och jag kan inte så mycket andra ord än de jag håller på med så ni får gärna vara så utförliga som möjligt. Jag är ganska säker på att jag tagit mig vattenöverhuvudet men det är kul att försöka iallafall.

using System; namespace Bussen { class ThePassangers { public string Name; public int Age; public string Sysselsättning; public ThePassangers[] Passanger; public ThePassangers(string _name, int _age, string _Jobb)//konstruktor { Name = _name; Age = _age; Sysselsättning = _Jobb; Passanger = new ThePassangers[35]; } public void add_passangers() { Passanger[0] = new ThePassangers("Erik", 14, "Student"); Passanger[1] = new ThePassangers("Felicia", 22, "Student"); Passanger[2] = new ThePassangers("Agda", 71, "Pensionär"); Passanger[3] = new ThePassangers("Mike", 43, "Kock"); Passanger[4] = new ThePassangers("Bengt", 52, "Lärare"); Passanger[5] = new ThePassangers("Moa", 16, "Student"); Passanger[6] = new ThePassangers("Niclas", 33, "Programmerare"); Passanger[7] = new ThePassangers("Sofia", 36, "Receptionist"); Passanger[8] = new ThePassangers("Cathrine", 28, "Växeltelefonist"); Passanger[9] = new ThePassangers("Andre", 32, "Fritids Pedagog"); Passanger[10] = new ThePassangers("Mark", 27, "Väktare"); Passanger[11] = new ThePassangers("Lu", 18, "Student"); Passanger[12] = new ThePassangers("Frank", 12, "Student"); Passanger[13] = new ThePassangers("Jacob", 25, "Personalchef"); Passanger[14] = new ThePassangers("Milton", 13, "Student"); Passanger[15] = new ThePassangers("Helena", 36, "Komunikatör"); Passanger[16] = new ThePassangers("Rickard", 26, "Programmerare"); Passanger[17] = new ThePassangers("Fredrik", 29, "Behovsanställd"); Passanger[18] = new ThePassangers("Inger", 55, "Löneadministration"); Passanger[19] = new ThePassangers("Edvin", 73, "Pensionär"); Passanger[20] = new ThePassangers("Urban", 45, "Distriktansvarig"); Passanger[21] = new ThePassangers("Oscar", 39, "Lärare"); Passanger[22] = new ThePassangers("Mikael", 52, "Naturvårdsspecialist"); Passanger[23] = new ThePassangers("Cecilia", 31, "Gruppchef"); Passanger[24] = new ThePassangers("Mikaela", 32, "Student"); Passanger[25] = new ThePassangers("Malin", 43, "Jaktansvarig"); Passanger[26] = new ThePassangers("Malin", 36, "Portvakt"); Passanger[27] = new ThePassangers("Olle", 26, "Jornalist"); Passanger[28] = new ThePassangers("Stefan", 39, "Ekonom"); Passanger[29] = new ThePassangers("Per", 18, "Student"); Passanger[30] = new ThePassangers("Stina", 17, "Student"); Passanger[31] = new ThePassangers("Johan", 22, "Student"); Passanger[32] = new ThePassangers("Elin", 14, "Student"); Passanger[33] = new ThePassangers("Alexandra", 19, "Student"); Passanger[34] = new ThePassangers("Fredric", 16, "Student"); } public void show_passanger() { foreach (var pas in Passanger) { Console.WriteLine(pas); } } } class Buss { public int[] passagerare = new int [25]; public int antal_passagerare = 25; public void Run() { Console.WriteLine("Welcome to the awesome Buss-simulator"); int alt = 0; do { Console.WriteLine("Dina alternativ"); Console.WriteLine("1 Hämta nästa passagerare"); Console.WriteLine("2 se hur passagerare sitter"); Console.WriteLine("3 beräkna totala åldern"); Console.WriteLine("4 beräkna medelvärdet på åldern"); /*Console.WriteLine("5 Sortera passagerarna");*/ Console.WriteLine("0 Avsluta simulatorn"); alt = int.Parse(Console.ReadLine()); switch (alt) { case 1:add_passenger(); break; case 2:print_buss(); break; case 3:Console.WriteLine("Den totala åldern är " + calc_total_age()); break; case 4:Console.WriteLine("Medelvärdet på den totala åldern i bussen är " + calc_average_age()); break; /*case 5: sort_buss(); break;*/ case 0: Console.WriteLine("Programmet avslutas"); break; default: Console.WriteLine("Felaktig inmatning"); break; } } while (alt != 0 ); } public void add_passenger() { var randomindex = Random.Next(0, ThePassangers.Length); for (int x = 0; x < passagerare.Length; x++) { int Age = randomindex; passagerare[x] = Age; } /*Random slump = new Random(); for (int x = 0; x < passagerare.Length; x++) { int Age = slump.Next(10, 75); passagerare[x] = Age; } Console.WriteLine("Passagerare har bordat."); foreach (int Age in passagerare) Console.WriteLine(Age);*/ //Lägg till passagerare. Här skriver man då in ålder men eventuell annan information. //Om bussen är full kan inte någon passagerare stiga på } public void print_buss() { foreach (var passagerarplats in passagerare) { Console.WriteLine("Passagerarnas ålder är: " + passagerarplats); } //Skriv ut alla värden ur vektorn. Alltså - skriv ut alla passagerare } public int calc_total_age() { int age = 0; foreach (int Alt in passagerare) { age = age + Alt; } return age; } public int calc_average_age() { int ageM = 0; foreach (int Alt in passagerare) { ageM = ageM + Alt; } ageM = ageM / passagerare.Length; return ageM; //Beräkna den genomsnittliga åldern. Kanske kan man tänka sig att denna metod ska returnera något annat värde än heltal? } /*public void sort_buss() { //Sortera bussen efter ålder. Tänk på att du inte kan ha tomma positioner "mitt i" vektorn. //Beskrivs i läroboken på sidan 147 och framåt (kodexempel på sidan 159) //Man ska kunna sortera vektorn med bubble sort }*/ } class Bussen { public static void Main(string[] args) { //Skapar ett objekt av klassen Buss som heter minbuss //Denna del av koden kan upplevas väldigt förvirrande. Men i sådana fall är det bara att "skriva av". var minbuss = new Buss(); ThePassangers Driver = new ThePassangers("Rick", 26, "Chafför"); Driver.add_passangers(); minbuss.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } }

Mvh Rickard

Permalänk
Medlem

Väljer att ta bort det jag skrev, då jag ser ännu mer tokigheter i din kod.

Gör som @snajk säger härunder,

Skrivet av snajk:

Du behöver tänka igenom sakerna lite mer skulle jag säga. Ska passagerarna vara en del av bussen? Ska du injecera passagerarna när du skapar bussen? Börja med att rita ett klassdiagram och kanske ett flödesschema innan du skriver koden.

t.ex. i din constructor för passagerare så har du:

public ThePassangers(string _name, int _age, string _Jobb)//konstruktor { Name = _name; Age = _age; Sysselsättning = _Jobb; Passanger = new ThePassangers[35]; }

Varje passagerare har alltså 35 nya passagerare?

En passagerare är EN passagerare.
En Buss har flera passagerare.

Försök rita upp det, som Snajk nämnde, så blir det enklare att koda sen

Permalänk
Medlem

Du behöver tänka igenom sakerna lite mer skulle jag säga. Ska passagerarna vara en del av bussen? Ska du injecera passagerarna när du skapar bussen? Börja med att rita ett klassdiagram och kanske ett flödesschema innan du skriver koden.

Permalänk
Medlem

Att ha en förbestämd lista med passagerare är inte en dum idé, se bara till att det verkligen ingår i uppgiften att det är tillåtet att göra så.

Men när det gäller din kod så verkar du ganska förvirrad över vad ThePassangers (det stavas förresten passengers) egentligen är. Om det är tänkt att klassen ska representera en lista med passagerare, varför innehåller den då namn, ålder, sysselsättning och en lista med instanser av sig själv?

Om du vill gå den vägen så skulle jag rekommendera dig att först och främst skapa en Passenger-klass som representerar en enda passagerare, och ThePassengers-klassen har sen bara en lista med Passenger-objekt. Listan med passagerare bör då även vara private och inte public, och all åtkomst till passagerarna bör ske genom metoder definierade i klassen (t.ex. en metod för att hämta en passagerare).

För att kunna använda detta i Buss-klassen måste du sen ha en instans av ThePassenger-klassen i Buss-klassen som den kan använda. En klass är ju i stort sett bara en mall för hur objekt av den typen ser ut, t.ex. om Frukt är en klass så är den här bananen (*pekar på bananen som ligger på mitt skrivbord*) en instans av Frukt, eller ett Frukt-objekt som man också brukar kalla det.

Sen är egentligen hela uppgiften ett dåligt exempel på hur OOP fungerar, det skulle vara bättre om meny-logiken låg i t.ex. Main istället och Buss bara tar hand om att hålla koll på passagerarna. Men det kanske är lite överkurs.

Permalänk
Medlem
Skrivet av Atrajs:

Hej.
Jag går en intensiv kurs i programmering 1 och är helt ny med programmering. Jag håller på med ett projekt som heter Bussen och i den ska vi göra en buss som plockar upp passagerare. Den ska även kunna visa upp varje passagerare, beräkna den totala åldern och beräkna medelvärdet på åldern. Jag tänkte ha förbestämda passagerare som finns i en class som heter ThePassangers, sen ska då i classen Buss så ska den under add_passenger kunna dra slumpat ut från classen ThePassangers. Men jag vet inte hur jag ska ta mig dit, jag har gjort en kod och den är lite grötig kanske men jag har utgått till vad jag fått för information av min lärare.

Men smått och gott så är min fråga hur ska jag kunna dra classen ThePassangers metoden add_passangers in till add_passanger i Buss classen? eller borde jag skrota hela idén?

Mina kunskaper är väldigt låga och jag kan inte så mycket andra ord än de jag håller på med så ni får gärna vara så utförliga som möjligt. Jag är ganska säker på att jag tagit mig vattenöverhuvudet men det är kul att försöka iallafall.

using System; namespace Bussen { class ThePassangers { public string Name; public int Age; public string Sysselsättning; public ThePassangers[] Passanger; public ThePassangers(string _name, int _age, string _Jobb)//konstruktor { Name = _name; Age = _age; Sysselsättning = _Jobb; Passanger = new ThePassangers[35]; } public void add_passangers() { Passanger[0] = new ThePassangers("Erik", 14, "Student"); Passanger[1] = new ThePassangers("Felicia", 22, "Student"); Passanger[2] = new ThePassangers("Agda", 71, "Pensionär"); Passanger[3] = new ThePassangers("Mike", 43, "Kock"); Passanger[4] = new ThePassangers("Bengt", 52, "Lärare"); Passanger[5] = new ThePassangers("Moa", 16, "Student"); Passanger[6] = new ThePassangers("Niclas", 33, "Programmerare"); Passanger[7] = new ThePassangers("Sofia", 36, "Receptionist"); Passanger[8] = new ThePassangers("Cathrine", 28, "Växeltelefonist"); Passanger[9] = new ThePassangers("Andre", 32, "Fritids Pedagog"); Passanger[10] = new ThePassangers("Mark", 27, "Väktare"); Passanger[11] = new ThePassangers("Lu", 18, "Student"); Passanger[12] = new ThePassangers("Frank", 12, "Student"); Passanger[13] = new ThePassangers("Jacob", 25, "Personalchef"); Passanger[14] = new ThePassangers("Milton", 13, "Student"); Passanger[15] = new ThePassangers("Helena", 36, "Komunikatör"); Passanger[16] = new ThePassangers("Rickard", 26, "Programmerare"); Passanger[17] = new ThePassangers("Fredrik", 29, "Behovsanställd"); Passanger[18] = new ThePassangers("Inger", 55, "Löneadministration"); Passanger[19] = new ThePassangers("Edvin", 73, "Pensionär"); Passanger[20] = new ThePassangers("Urban", 45, "Distriktansvarig"); Passanger[21] = new ThePassangers("Oscar", 39, "Lärare"); Passanger[22] = new ThePassangers("Mikael", 52, "Naturvårdsspecialist"); Passanger[23] = new ThePassangers("Cecilia", 31, "Gruppchef"); Passanger[24] = new ThePassangers("Mikaela", 32, "Student"); Passanger[25] = new ThePassangers("Malin", 43, "Jaktansvarig"); Passanger[26] = new ThePassangers("Malin", 36, "Portvakt"); Passanger[27] = new ThePassangers("Olle", 26, "Jornalist"); Passanger[28] = new ThePassangers("Stefan", 39, "Ekonom"); Passanger[29] = new ThePassangers("Per", 18, "Student"); Passanger[30] = new ThePassangers("Stina", 17, "Student"); Passanger[31] = new ThePassangers("Johan", 22, "Student"); Passanger[32] = new ThePassangers("Elin", 14, "Student"); Passanger[33] = new ThePassangers("Alexandra", 19, "Student"); Passanger[34] = new ThePassangers("Fredric", 16, "Student"); } public void show_passanger() { foreach (var pas in Passanger) { Console.WriteLine(pas); } } } class Buss { public int[] passagerare = new int [25]; public int antal_passagerare = 25; public void Run() { Console.WriteLine("Welcome to the awesome Buss-simulator"); int alt = 0; do { Console.WriteLine("Dina alternativ"); Console.WriteLine("1 Hämta nästa passagerare"); Console.WriteLine("2 se hur passagerare sitter"); Console.WriteLine("3 beräkna totala åldern"); Console.WriteLine("4 beräkna medelvärdet på åldern"); /*Console.WriteLine("5 Sortera passagerarna");*/ Console.WriteLine("0 Avsluta simulatorn"); alt = int.Parse(Console.ReadLine()); switch (alt) { case 1:add_passenger(); break; case 2:print_buss(); break; case 3:Console.WriteLine("Den totala åldern är " + calc_total_age()); break; case 4:Console.WriteLine("Medelvärdet på den totala åldern i bussen är " + calc_average_age()); break; /*case 5: sort_buss(); break;*/ case 0: Console.WriteLine("Programmet avslutas"); break; default: Console.WriteLine("Felaktig inmatning"); break; } } while (alt != 0 ); } public void add_passenger() { var randomindex = Random.Next(0, ThePassangers.Length); for (int x = 0; x < passagerare.Length; x++) { int Age = randomindex; passagerare[x] = Age; } /*Random slump = new Random(); for (int x = 0; x < passagerare.Length; x++) { int Age = slump.Next(10, 75); passagerare[x] = Age; } Console.WriteLine("Passagerare har bordat."); foreach (int Age in passagerare) Console.WriteLine(Age);*/ //Lägg till passagerare. Här skriver man då in ålder men eventuell annan information. //Om bussen är full kan inte någon passagerare stiga på } public void print_buss() { foreach (var passagerarplats in passagerare) { Console.WriteLine("Passagerarnas ålder är: " + passagerarplats); } //Skriv ut alla värden ur vektorn. Alltså - skriv ut alla passagerare } public int calc_total_age() { int age = 0; foreach (int Alt in passagerare) { age = age + Alt; } return age; } public int calc_average_age() { int ageM = 0; foreach (int Alt in passagerare) { ageM = ageM + Alt; } ageM = ageM / passagerare.Length; return ageM; //Beräkna den genomsnittliga åldern. Kanske kan man tänka sig att denna metod ska returnera något annat värde än heltal? } /*public void sort_buss() { //Sortera bussen efter ålder. Tänk på att du inte kan ha tomma positioner "mitt i" vektorn. //Beskrivs i läroboken på sidan 147 och framåt (kodexempel på sidan 159) //Man ska kunna sortera vektorn med bubble sort }*/ } class Bussen { public static void Main(string[] args) { //Skapar ett objekt av klassen Buss som heter minbuss //Denna del av koden kan upplevas väldigt förvirrande. Men i sådana fall är det bara att "skriva av". var minbuss = new Buss(); ThePassangers Driver = new ThePassangers("Rick", 26, "Chafför"); Driver.add_passangers(); minbuss.Run(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } }

Mvh Rickard

Utan att hjälpa till med själva kodandet så håller jag med föregående talare.

Har dock lite tips att ge. Om du ska programmera så är det viktigt att man förhåller sig till ett språk när man namnger variabler. Jag generellt sett brukar undvika svenska med åäö, men att blanda mellan svenska och engelska är bättre att undvika, skriv variabelnamn, klassnamn etc på antingen svenska, eller engelska.

Denna del i din kod:
public ThePassangers(string _name, int _age, string _Jobb)//konstruktor
{
Name = _name;
Age = _age;
Sysselsättning = _Jobb;
Passanger = new ThePassangers[35];

}

Där skulle jag skriva string _job istället för string _Jobb, det är blandat mellan svenska och engelska där.
Det är bra om man kan hålla isär variabler som ska börja med liten eller stor bokstav.

t ex om du skrev hela delen på svenska:
public Passagerarna(string _namn, int _ålder, string _sysselsättning)
{
Namn = _namn;
Ålder = _ålder;
Sysselsättning = _sysselsättning;
Passagerare = new Passagerarna();

}

Inte superfint skrivet kodmässigt av mig, men att namnge saker tydligt underlättar vid felsökning och att man följer samma mönster, långa variabelnamn gör ingenting så länge det är tydligt.

Någon får slå mig på fingrarna om jag skrivit något olämpligt

Permalänk
Medlem

Okej sorry för sent svar men efter att jag läst det ni skrivit så tog jag beslutet att hoppa mina storslagna idéer för tillfället och bara satsa på det som uppgiften begärt. Men nu är jag har petat på det och är närmare klar(Ni kan få se om ni vill) så tänkte jag att jag kunde kika in på mina idéer igen. Jag kanske inte gick i igenom min tanke väg riktigt heller i första inlägget.

Jag tänkte att om jag gör en klass, som jag knappt vet vad det är, så skulle jag kunna ha 35 färdiga passagerare, bussen kan bara rymma 25st passagerare. Sen skulle jag kunna anropa den till bussen med en Slumpad väljare som väljer ut några eller någon ur den listan, Då de ska komma sen in i bussen fick de presentera sig och användaren(busschauffören) får då skriva in personens Namn, Ålder och "Jobb", på så sätt lägger jag in realismen av att busschauffören aldrig kan bestämma vilka som den ska plocka upp och att man aldrig vet vad som kommer eller hur många som vill med. Min tanke var sen då att det skulle kunna slå in olika Events när användaren klickar på hämta nästa passagerare, så som ex att det skulle vara en björn mamma med 2 björnungar på sidan av vägen ena halvan av bussen reser sig upp för att kika. men nu hamnar dom huller om buller och användaren måste då använda sorteraren för att lösa detta. En till exempel vore att det blir bråk och chauffören får alternativ att stoppa bråket eller att bara fortsätta köra för det är ju ändå tidspress när man kör buss, fast inte i detta fall egentligen då. Jag börja ju inse att jag kanske gått lite för långt för att vara en veckas slut uppgift och vi inte fått göra något med klasser eller metoder innan riktigt. är ju som sagt en intensiv kurs och då vi ska lära oss typ 60 sidor i en bok med 5 uppgifter att lämna in varje vecka så har jag inte lyckats printa in eller förstått allt i detalj till den nivån att kanske kunna göra ett sånt här projekt men det är ju kul att komma på idéer och sen göra dom med.

@NisseG91:
Ja jo koden var och är ju inte äns nära på att vara klar, min metod hittills att lösa problem är success through failure, som kanske är fel men det tar mig framåt och jag lär mig bäst genom att se och göra, dålig på att ta åt mig i läsning, då måste det vara tydligt, but i try.

Problemet blir väll att jag inte vet riktigt vad ett klassDiagram är så jag får nog sätta mig ner och läsa mer om klasser först. Men tack så mycket för tippsen. Men vore det då rätt av mig om man så att säga sätter alla passagerarna i Buss klassen som en list eller en slags metod eller borde dom fortfarande vara utan för i sin egna klass?

@snajk:
Ja jo som jag skrev så klassDiagram vet jag inget om då jag kanppt vet nått om klasser, vi fick liksom 150sidor att läsa förra veckan inklusive 7 uppgifter så under stress har jag inte riktigt hunnit ta åt mig varje detalj heller men jag ska kika på det.
Min tanke är iallafall att dom står på gatan och väntar på bussen, så de är ju injecerade när väl bussen kommer dit i guess.

@perost:
Ja min lärare godkände ju min planering som jag fick göra förra gången men det var en väldigt bra fråga så jag skickade det till min lärare så väntar på svar där.

Jo det är en utmärkt fråga, jag utgick från Oscar Antbrings video där han lägger in 2 hundar i en klass och gör men som du säger så förstod jag inte helt vad han gjorde i den videon men jag tänkte om jag skriver in och testar så får jag se vad som blir och på så vis kan jag gå vidare. Namn ålder och sysselsättning tänkte jag att då kan man grena det sen i utskriften med _name, _age, _job. Så får man fram mot varje person i Console.WriteLinen, men jag tänkte väll snett där då. Men ja jag vet jag är usel på stavning (^^") men tack för påpekandet.

Citat:

Om du vill gå den vägen så skulle jag rekommendera dig att först och främst skapa en Passenger-klass som representerar en enda passagerare, och ThePassengers-klassen har sen bara en lista med Passenger-objekt. Listan med passagerare bör då även vara private och inte public, och all åtkomst till passagerarna bör ske genom metoder definierade i klassen (t.ex. en metod för att hämta en passagerare).

Okej men vad menar du med Passenger-objekt? Sen om den är private då kan jag väll inte hämta ut något från den? Och slutligen så är det ju väll det som är mitt största problem, att jag inte vet i kod hur jag kan ta en klass in i den andra via metod eller i en metod.

Citat:

För att kunna använda detta i Buss-klassen måste du sen ha en instans av ThePassenger-klassen i Buss-klassen som den kan använda. En klass är ju i stort sett bara en mall för hur objekt av den typen ser ut, t.ex. om Frukt är en klass så är den här bananen (*pekar på bananen som ligger på mitt skrivbord*) en instans av Frukt, eller ett Frukt-objekt som man också brukar kalla det.

Okej då kommer ju fortfarande samma punkt som ovan men jag tror att jag förstår resten. Jag tänkte att en klass är lite som en vektor, att den är som en samlingsplats för information men en vektor har ju siffror så kan en klass ha mycket mer. Sen när jag ändå är inne på Vektor, jag läste att ordet Vektor inte finns i C# utan att det är en Array, stämmer det? Tänkte att skolans böcker skriver ju vektor men det heter inte Vektor, lite små konstigt.

Sen slutligen så ja det kanske är så att uppgiften är dåligt exempel det vet jag inget om. Jag har ju ett kodskal från skolan som jag ska använda och jag ska skriva efter uppgiften de skickade ut(kan se om jag har en länk till den ifall ni vill se den) men jag tror nog det blir överkurs och möjligen fel om jag sträcker mig utanför området för mycket.

@Mahkizmo:

Nä men det är jätte bra att du berättar ändrar det och ska ha det i åtanke framöver

Permalänk
Medlem

@Atrajs: Ursäkta om det här blir lite för grundläggande, men du verkar lite förvirrad över klasser så... Man kan säga att en klass är som en ritning, den beskriver hur man skapar objekt av en viss typ. Tänk dig t.ex. att du har en Passenger-klass (förenklad med enbart namn):

class Passenger { public Passenger(string name) { this->name = name; } private string name; }

Passenger i sig har inget namn, den beskriver bara hur Passenger-objekt ser ut. Du kan sedan skapa instanser av klassen:

Passenger p1 = new Passenger("Markus"); Passenger p2 = new Passenger("Eva");

p1 och p2 är här två olika instanser av Passenger, eller Passenger-objekt, och varje instans har sitt eget namn.

Så när du säger att du inte vet hur man "ta en klass in i en annan" så frågar du egentligen efter hur du kan använda instanser av en klass i instanser av en annan klass. Du kan i stort sett göra detta på två sätt: skicka in en instans utifrån (s.k. dependency injection) eller skapa en instans inne i klassen:

// Alternativ 1 class Buss { private ThePassengers passengers; public Buss(ThePassengers passengers) { this->passengers = passengers; } } public static void Main(string[] args) { ThePassengers passengers = new ThePassengers(); Buss bus = new Buss(passengers); } // Alternativ 2 class Buss { private ThePassengers passengers = new ThePassengers(); } public static void Main(string[] args) { Buss bus = new Buss(); }

Alternativ 2 är som synes enklare, men alternativ 1 ger användaren mer möjligheter att anpassa instansen som skickas in (användaren skulle t.ex. kunna fylla i listan med passagerare själv innan den skickas in till bussen).

Skrivet av Atrajs:

Okej men vad menar du med Passenger-objekt? Sen om den är private då kan jag väll inte hämta ut något från den? Och slutligen så är det ju väll det som är mitt största problem, att jag inte vet i kod hur jag kan ta en klass in i den andra via metod eller i en metod.

Man vill normalt inte att vem som helst ska komma åt data i en klass-instans, då har man ju ingen kontroll över om datan är giltig eller inte. Istället för att ha public-variabler som vem som helst kan ändra på så är det därför nästan alltid bättre att göra sina variabler private, och istället ha metoder som användarna kan använda (s.k. data encapsulation). T.ex. om vi bygger vidare på min Passenger-klass ovan:

class Passenger { public Passenger(string name) { this->name = name; } public string getName() { return name; } public void setName(string name) { this->name = name; } private string name; }

Det kanske inte ser ut som att det här är mycket bättre än om name bara vore public, men skillnaden är att vi här t.ex. kan lägga in en kontroll i setName som kollar om ett namn är giltigt (t.ex. kontrollera att det bara innehåller vanliga bokstäver och inte t.ex. siffror).

Du kanske inte vill göra något sånt just nu, men om du i framtiden kommer på att du vill göra det så är det betydligt enklare att göra det om du redan vet att all åtkomst utifrån sker genom vissa metoder. Samma om du vill ha en klass med en lista med passagerare som kan slumpa fram en specifik passagerare, då är det bättre att ha en metod i den klassen som returnerar en slumpmässig passagerare än att användaren av klassen ska behöva göra det själv.

Permalänk
Medlem
Skrivet av perost:

@Atrajs: Ursäkta om det här blir lite för grundläggande, men du verkar lite förvirrad över klasser så... Man kan säga att en klass är som en ritning, den beskriver hur man skapar objekt av en viss typ. Tänk dig t.ex. att du har en Passenger-klass (förenklad med enbart namn):

class Passenger { public Passenger(string name) { this->name = name; } private string name; }

Passenger i sig har inget namn, den beskriver bara hur Passenger-objekt ser ut. Du kan sedan skapa instanser av klassen:

Passenger p1 = new Passenger("Markus"); Passenger p2 = new Passenger("Eva");

p1 och p2 är här två olika instanser av Passenger, eller Passenger-objekt, och varje instans har sitt eget namn.

Så när du säger att du inte vet hur man "ta en klass in i en annan" så frågar du egentligen efter hur du kan använda instanser av en klass i instanser av en annan klass. Du kan i stort sett göra detta på två sätt: skicka in en instans utifrån (s.k. dependency injection) eller skapa en instans inne i klassen:

// Alternativ 1 class Buss { private ThePassengers passengers; public Buss(ThePassengers passengers) { this->passengers = passengers; } } public static void Main(string[] args) { ThePassengers passengers = new ThePassengers(); Buss bus = new Buss(passengers); } // Alternativ 2 class Buss { private ThePassengers passengers = new ThePassengers(); } public static void Main(string[] args) { Buss bus = new Buss(); }

Alternativ 2 är som synes enklare, men alternativ 1 ger användaren mer möjligheter att anpassa instansen som skickas in (användaren skulle t.ex. kunna fylla i listan med passagerare själv innan den skickas in till bussen).

Man vill normalt inte att vem som helst ska komma åt data i en klass-instans, då har man ju ingen kontroll över om datan är giltig eller inte. Istället för att ha public-variabler som vem som helst kan ändra på så är det därför nästan alltid bättre att göra sina variabler private, och istället ha metoder som användarna kan använda (s.k. data encapsulation). T.ex. om vi bygger vidare på min Passenger-klass ovan:

class Passenger { public Passenger(string name) { this->name = name; } public string getName() { return name; } public void setName(string name) { this->name = name; } private string name; }

Det kanske inte ser ut som att det här är mycket bättre än om name bara vore public, men skillnaden är att vi här t.ex. kan lägga in en kontroll i setName som kollar om ett namn är giltigt (t.ex. kontrollera att det bara innehåller vanliga bokstäver och inte t.ex. siffror).

Du kanske inte vill göra något sånt just nu, men om du i framtiden kommer på att du vill göra det så är det betydligt enklare att göra det om du redan vet att all åtkomst utifrån sker genom vissa metoder. Samma om du vill ha en klass med en lista med passagerare som kan slumpa fram en specifik passagerare, då är det bättre att ha en metod i den klassen som returnerar en slumpmässig passagerare än att användaren av klassen ska behöva göra det själv.

All in All så är så grundläggande som möjligt så positivt som möjligt, jag förstår bättre men nått som istället blev som ett frågetecken är det du skrev i koden som exempel, detta: this->name=name; vad är this ->? det blev något helt nytt för mig XD.
Men då instanserna P1 och P2 ex ska vara nere i buss klassen då alltså eller tänker jag fel?

Jag ska helt klart ha det i baktanke framöver åtminstone.

Permalänk
Medlem
Skrivet av Atrajs:

All in All så är så grundläggande som möjligt så positivt som möjligt, jag förstår bättre men nått som istället blev som ett frågetecken är det du skrev i koden som exempel, detta: this->name=name; vad är this ->? det blev något helt nytt för mig XD.

Oops, fel språk this.name = name ska det förstås vara. this är en referens till instansen själv om du inte redan visste det. Istället för att behöva hitta på olika namn på variabeln i klassen och argumentet till konstruktorn så kan man särskilja dem med this, d.v.s.:

class Passenger { public Passenger(string name) // <- name { this.name = name; } private string name; // <- this.name }

Skrivet av Atrajs:

Men då instanserna P1 och P2 ex ska vara nere i buss klassen då alltså eller tänker jag fel?

p1 och p2 var bara ett exempel på hur man skapar instanser. I ditt fall vill du antagligen ha en lista/array med Passenger-instanser i både ThePassenger- och Buss-klassen, och sen flytta passagerare från en till den andra.

Permalänk
Medlem
Skrivet av perost:

Oops, fel språk this.name = name ska det förstås vara. this är en referens till instansen själv om du inte redan visste det. Istället för att behöva hitta på olika namn på variabeln i klassen och argumentet till konstruktorn så kan man särskilja dem med this, d.v.s.:

class Passenger { public Passenger(string name) // <- name { this.name = name; } private string name; // <- this.name }

p1 och p2 var bara ett exempel på hur man skapar instanser. I ditt fall vill du antagligen ha en lista/array med Passenger-instanser i både ThePassenger- och Buss-klassen, och sen flytta passagerare från en till den andra.

Oohh okej ja men då förstår jag, tack så mycket!