Kan någon förklara det där med klasser och objekt?

Permalänk

Kan någon förklara det där med klasser och objekt?

Hej.

Jag undrar om någon här kan förklara det dära med klasser, objekt, konstruktörer, private och public. Vaför? Hur? När? Ska det användas?

ID Software gjorde Quake II i rent C och det gick ju! Så snälla, förklara det där med objektorienterat.

Jag läser VB.NET men kursen är till för att kunna tänket bakom programmeringen och inte något specifikt språk.

Skickades från m.sweclockers.com

Permalänk
Medlem

Som jag förstått det använder man objektorienterad programmering som ett sätt att dela upp programmet i bestämda separata delar. Objekt kan ses som en sorts data som kan ha egenskaper och funktioner. En klass beskriver det där objektet. En konstruktör är väl en beskrivning inuti klassen hur ett sådant objekt skapas. Private betyder att det inte är åtkomligt utifrån från andra delar av programmet som inte hör till det objektet medans public betyder att det är åtkomligt utifrån. Sedan finns det saker som arv där man kan skapa objekt som ärver vissa delar från en övergripande objektbeskrivning.

Så en klass är alltså en slags datatyp med vissa egenskaper och funktioner (tror man brukar kalla funktionerna för metoder). Skapar man en variabel (alltså ett objekt) av den datatypen så anropas klassens konstruktör som fixar allt som behövs för att skapa objektet. Objektet kan innehålla diverse data och de som man kan påverka utifrån deklareras som public. Säg att man skapar ett objekt som är av typen bil så kanske man kan ställa in egenskaper som motoreffekt, maxhastighet, färg och vikt med mera. Sedan kanske det finns metoder (alltså funktioner) som att starta motorn, sätt på vindrutetorkaren och så vidare. Även metoder kan vara privata eller publika beroende på om de ska vara åtkomliga utifrån eller inte. Sedan kanske man vill skapa en klass som beskriver någon särskild sorts biltyp då kan man låta den klassen ärva saker från klassen bil så slipper man återskapa det som redan finns i den övergripande klassen.

Fördelen är väl att man kan tänka på programmets delar som objekt vilket kan underlätta när man skapar större program där många utvecklare är med och skapar separata delar. Det är ett sätt att minska oredan i större programmeringsprojekt genom att ha ett standardiserat sätt att tänka på och man kan isolera all kod som inte behöver kommas åt utifrån. Visst kan man göra detta även utan objektorientering genom att tillämpa bestämda regler. Som jag förstått det är det inte ovanligt med objektorienterat tänk även då man programmerar i exempelvis C, men det styrs liksom inte av programspråket då utan man får klura ut reglerna själv på något vis.

Men om man däremot ska göra något enklare program kan det kännas onödigt omständigt med objekttänkandet. Så det är väl lite efter behoven vilket som funkar bäst.

Har själv läst lite C# och fick lite objektorienterat tänk då. Men numera kör jag Linux och känner därför att C# (samt .NET) inte känns lika relevant längre men jag kan ju ändå ha nytta av tänket om jag skulle vilja programmera i exempelvis Java eller Python (eller om jag mot förmodan kör C# via mono). Ser det själv som viktigare att förstå tänket än att lära sig specifikt språk för man kan ju applicera samma tänk även inom andra programspråk.

Permalänk
Medlem

Meningen med objektorienterad (OO) programmering/programspråk är att återanvända kod på systematiskt sätt till flera olika objekt.

Själv lärde jag mig det via ett mudd (textbaserad mmorpg) som var skrivet i en OO-variant av enklare c-kod. Där var det ganska enkelt att lära sig saker som klasser, objekt, arv och hur de kunde användas.

Exempel: Ta två troll (Albert och Ben) som väntar på en väg.
Troll skulle då vara en klass, dvs de skulle ha gemensamma funktioner och egenskaper som alla troll kan ha. Vandra,plocka upp saker, slåss eller fly.
Albert och Ben skulle vara två olika objekt av klassen "troll". De kanske har lite olika storlek eller utrustning till att börja med.

Vägen är ett annat objekt, av klassen "plats".

Konstruktörer är funktioner som skapar nya objekt av en klass och ställer in de egenskaper som gäller just det objektet. Konstruktören för klassen "troll" ställer in storlek, färg och namn för nya troll.

Det fina med klasser i OOP är att man kan låta en klass ärva egenskaper/funktioner från en annan klass.
Säg att vi vill stoppa in draken Göran också som dessutom kan spruta eld.
En ny klass "drake" som vi enklast låter ärva alla funktioner/egenskaper/förmågor från klassen "troll", men vi lägger till "spruta eld" som stridsförmåga. Vi definierar om storlek och utseende också så att drakarna inte ser ut som eldsprutande troll.

Nu är den här indelningen klassindelningen kanske inte den bästa (minst sagt) men den funkar. Vill vi lägga till nya förmågor för alla våra kära monster så lägger vi till de förmågorna i basklassen "troll". Vissla kanske ska vara en ny förmåga? Då behöver bara ändra på ett ställe, i klassen troll. En mer genomtänkt klassindelning vore att ha klassen "varelse" för allt som kan röra sig/slåss och låta klasserna "drake" och "troll" ärva därifrån.

Visa signatur

Det var enklare förr att skilja Asus moderkort åt:
Asus A7V -> Asus P5Q Pro -> Asus M4A88TD-V EVO/USB3

Permalänk

Så vi säger att vi tar ett djur. Då är djuret en klass.
Djuret jagar ett annat djur. Istället för att skapa dubbelkod så kan man bara säga att man gör en kod som dessa djur passar sig in?

Och klassen kan hålla in massvis med info om djuren, trots samma kod? Alltså man slipper koda så mycket?

Permalänk
Medlem

Klassen djur innehåller sådant som är gemensamt för alla djur. Sedan kanske du vill skapa klassen fågel och klassen fisk som båda är djur men ändå har vissa olikheter. Då låter man fågel och fisk ärva det gemensamma från djur och så bygger man på med det som är speciellt för fåglar och fiskar. En fågel är ett djur. Däremot är inte alla djur fåglar. Så det logiska är alltså att låta klassen fågel ärva saker från djur men däremot blir det fel om man låter djur ärva från fågel eftersom alla djur inte är fåglar. Sedan kanske du vill skapa klassen haj som kan få ärva från fisk men däremot silverfisk kanske du hellre placerar i klassen insekter (eller är det en insekt egentligen, tror det). Men guldfisk är en fisk i alla fall. Sedan kanske du vill loopa igenom en array med fiskar och göra något med dessa och då går det bra trots att en del av dem är guldfiskar och andra är hajar eftersom du endast påverkar det som är gemensamt för alla fiskar. Eller om du vill göra något med alla djur så kan det också gå bra om du bearbetar dem som djur. En guldfisk är alltså en fisk men samtidigt så är den också ett djur. Detta kan man alltså utnyttja genom klassificeringen man gör när man programmerar objektorienterat.

Här står det lite mer: http://sv.wikipedia.org/wiki/Objektorienterad_programmering

Permalänk
Datavetare

Man ska vara medveten om att OOP en gång i tiden togs fram för simulering och passar väldigt bra där. Spel är också i stora delar en sorts simulering och OOP passar rätt bra dit också.

Men rent generellt är det en brutalt överanvändning av OOP, det är långt i från rätt metod att angripa alla problem. De flesta former av algoritmer har i sig inget associerat tillstånd och ska därför vara funktioner och inte metoder associerade med en klass. Idén om att kapsla in data och definiera en metoder för att ändra tillståndet på objektet passar också väldigt illa om man jobbar med system där det finns flera samtidigt körande trådar (spelar ingen roll om det är en eller fler CPU-kärnor).

Arv är långt ifrån den enda sättet att uttrycka polymorfism, finns flera språk som inte har arv (t.ex. Go) eller där det i alla fall inte är ett krav för metoder där anropad funktion beror på argument/tillstånd/etc (t.ex. Clojure).

Rätt intressant (eller skrämmande beroende på hur man ser det) att så mycket affärslogik skrivs i språk som har mycket syntaktisk socker för OOP då tillståndet typisk ligger i en databas + kommer in via anrop medan själva affärslogiken inte har ett associerat tillstånd vilket gör OOP helt fel abstraktion.

OOP är lämpligt där den mest naturliga abstraktionen är att något som har ett tillstånd och du enkelt kan tänka ut en rimlig mängd metoder som modifierar och/eller agerar på det tillståndet. Varje enhet i ett RTS är ett typiskt objekt, vilken klass det har beställer vilken typ av enhet det är, objektet vet position, hit-points etc. Alla skott, raketer etc kan också modelleras som enskilda objekt även om man behöver skriva egen minneshantering för sådant då det kan finnas många instanser (pratar av erfarenhet, även om det är väldigt länge sedan jag utvecklade spel nu).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare
Skrivet av heretic16:

Så vi säger att vi tar ett djur. Då är djuret en klass.
Djuret jagar ett annat djur. Istället för att skapa dubbelkod så kan man bara säga att man gör en kod som dessa djur passar sig in?

Och klassen kan hålla in massvis med info om djuren, trots samma kod? Alltså man slipper koda så mycket?

Två djur som i din abstraktion har identiska egenskaper kan vara samma klass. T.ex. så skulle du nog inte ha olika klasser för hane/hona eller för om pälsen är vit eller svart, sådana skillnaden kan du modellera som objekt-specifika variabler.

Du kan du skapa massor med sådana djur med väldigt lite kod, men ändå hålla reda på varje unik individ (inom ramen för vad du valt att modellera).

Men OOP ger inte mer eller mindre kod än andra metoder, det är bara ett sätt av många att göra modellering av något.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Alltså, de djuren skulle vara av klassen Djur, men, om det ena är Köttätande o det andra Växtätande, då skiljer de i beteende, alltså är de inte av samma klass, men de delar fortfarande samma egenskaper som ett djur har, alltså är det en vidareutveckling av djurklassen som blivit dels Köttätande djur och Växtätande djur.

Se det med människor istället, Kålle o Ada är båda av klassen Person, men man kan också dela in personer i Anställda och Kunder. Då får du attributen, beteendet, osv för en Person(typ namn, födelsedatum, kön, osv) på båda två, men i anställda o kunder behöver du ha olika information utöver grunden.

Tar ifrån en bok som ligger bredvid mig:

Objekt: En entitet med identitet, tillstånd och beteende.
Klass: En beskrivning av en samling objekt som delar struktur, beteendemönster och attribut.

Permalänk
Medlem

Pether, jag tror att poängen var att vi kan utgå från samma klass och göra ändringarna i instansen istället för i klassen.

Säg att du har skapat en klass som beskriver hunddjur, den har ett attribut som heter föda. Du vill nu skapa två instanser, den ena beskriver en varg, och den andre beskriver en öronhund. Den enda skillnaden du skulle kunna göra är att du säger att attributet föda hos vargen är köttätare, och att öronhunden är en insektivor, insektsätare. Då har du nu två instanser av samma klass som beskriver två vitt skilda individer som ändå liknar varandra på vissa plan, utan att behöva skapa en specifik klass för varje fall.

Permalänk
Medlem

Men de skiljer i beteende. Ett djur som Jagar o ett djur som Idisslar har inte samma beteende. De är djur, ja, men de behöver ytterligare beskriva sina beteenden för att det ska bli helt korrekt. Det handlar inte om helt nya klasser, utan att de helt enkelt ärver ifrån klassen Djur o får nya attribut o funktioner, utöver de som finns i Djur.

Vi kan ju ta det i en jämförelse med spelprogrammering. Du har ju en klass Entitet för alla entiteter, men entiteten Byggnad skiljer sig ifrån Enhet, vidare skiljer sig Landenhet, Luftenhet och Vattenenhet ifrån varandra.
Du kan ha en variabel i klassen som säger vilken typ av enhet det är o sedan köra massa If-satser för att göra skillnaden, men det är inte objektorienterat.

Permalänk
Medlem

Ja, jag skummade igenom tråden imorse och missförstod lite vad som diskuterades. Ursäkta för det!

Permalänk

Jag har listat ut vad klasser är nu!

Jag tycker att klasser var riktigt bra att använda. Jag är en gammal C-programmerare men har bytt upp mig till C++ och VB.NET.

Innan jag höll på med klasser så hade jag sjukt många variabler så jag bollade fram och tillbaka med. Men nu betraktar jag klasser typ som en hylla där man kan enkelt placera variablerna och plocka fram dom, med samma variabel

Jag har inte kommit till konstuktörer än eller objekt. Men det kommer.

Jag går denna kurs och första lektionen var klasser. Inte något snack om variabler eller liknande hehe.
http://edu.mah.se/sv/Course/DA206A#Syllabus

Bra kurs? Njaa. Bra lärare? Njaaa. Man får ingen hjälp iallafall. Allt hänger på sig själv för att få betyg i kursen. Annars fungerar det OK.

Permalänk
Medlem
Skrivet av heretic16:

Jag har listat ut vad klasser är nu!

Jag tycker att klasser var riktigt bra att använda. Jag är en gammal C-programmerare men har bytt upp mig till C++ och VB.NET.

Innan jag höll på med klasser så hade jag sjukt många variabler så jag bollade fram och tillbaka med. Men nu betraktar jag klasser typ som en hylla där man kan enkelt placera variablerna och plocka fram dom, med samma variabel

Jag har inte kommit till konstuktörer än eller objekt. Men det kommer.

Jag går denna kurs och första lektionen var klasser. Inte något snack om variabler eller liknande hehe.
http://edu.mah.se/sv/Course/DA206A#Syllabus

Bra kurs? Njaa. Bra lärare? Njaaa. Man får ingen hjälp iallafall. Allt hänger på sig själv för att få betyg i kursen. Annars fungerar det OK.

Tänk klasser som en ritning, de kanske ligger i en hylla om du så vill. Ett objekt är när din ritning kommer till liv, t.ex. om du har en ritning till en bil så är objektet den riktiga bilen. Ritningen kan återanvändas för att bygga andra bilar, men det finns bara en av din bil. Konstruktorn används när du bygger bilen, dvs när du skapar ett objekt. Du kanske vill ge bilen ett modellnamn och en färg, det gör du i konstruktorn.

Permalänk
Medlem
Skrivet av heretic16:

Innan jag höll på med klasser så hade jag sjukt många variabler så jag bollade fram och tillbaka med. Men nu betraktar jag klasser typ som en hylla där man kan enkelt placera variablerna och plocka fram dom, med samma variabel

Hm, fast det där låter mer som struct i C. Poängen med klasser är snarare att man paketerar "beteende" (metoder) med datan i fråga för att lättare nå en hög abstraktionsnivå, i.o.m. att man inte behöver känna till hur datan ska manipuleras för att använda ett objekt av klassen på rätt sätt. Av denna anledning brukar man använda get- och setmetoder istället för att gå direkt på medlemsvariablerna.

Detta ska åtminstone i teorin underlätta kodåteranvändning: "Vi behöver en klass som modellerar en viss grej." - "Just det, i det där projektet behövde vi en klass för samma sak, tack vare OOP kan vi återanvända den trots att ingen minns hur själva implementationen fungerade!" - "Fast vi behöver få den att göra lite mer saker här, så vi använder arv!", osv. I verkligheten är det väl sällan det går så smärtfritt.

Visa signatur

Osedd trädde kung Priamos in och gick fram till Achilles
och sina armar slog om hans knän och kysste hans hårda,
mordiska händer, som hade förgjort så många hans söner.