Seneste forumindlæg
Køb / Salg
 * Uofficiel Black/White liste V3
Login / opret bruger

Forum \ Programmering og webdesign \ Programmering
Denne tråd er over 6 måneder gammel

Er du sikker på, at du har noget relevant at tilføje?

Java og nedarving - hjælp søges

Af Gæst Ronnie | 31-10-2013 13:31 | 2698 visninger | 38 svar, hop til seneste
Hej gutter. Jeg er i gang med at lærer Java. Jeg har et relativ kompleks program, ift. mit niv. så jeg sidder fast og i er nok de eneste der kan hjælpe mig.:) Sagen er: Jeg er ligeglad med, hvad programmet skal. Jeg ønsker bare at demonstrerer, at jeg arbejder med nedarving. Det drejer sig om 2 forskellige klasser(de andre klasser er underordnet)og i må MEGET gerne implementerer et par nedarvings funktioner, så jeg kan se, hvordan det fungere. Denne klasse: http://pastebin.com[...] Skal være subclass, til denne klasse: http://pastebin.com[...] Når jeg skriver 'extends' efter klasse navn(første link), giver programmet fejl, a la "konstruktøren findes ikke". Og jeg kan ikke nå længere. 1000 tak for hjælpen.
--
Gæstebruger, opret dit eget login og få din egen signatur.
#1
Solfar
Nørd Aspirant
31-10-2013 13:37

Rapporter til Admin
Hej Ronnie. Har desværre ikke mulighed for, at hjælpe dig nu. Java er et godt sprog, at lære, når du først kan det, virker det som en leg, at lære andre sprog. Ved ikke om du følger nogle tutorials, men ellers kan jeg anbefale dig bogen og konceptet der hedder Objects first with Java. http://www.bluej.org[...] Det er et godt redskab, der giver en grunding gennemgang af det hele, b.la en masse med nedarvning.
--
#2
NitroBlast
Monster Nørd
31-10-2013 13:58

Rapporter til Admin
Din nedarvning giver IMO ikke nogen mening. For at det skal give mening, så kunne du overveje at lave en basisklasse "class Billet", der har egenskaber, der er fælles for alle billettyper (feks. Billet.Pris, Billet.Gebyr, Billet.Fra, Billet.Til, Billet.Udskriv() etc.). Herefter kan du nedarve "Billet" 3 gange - hhv. "class BoerneBillet extends Billet", "class VoksenBillet extends Billet" og "class TillaegsBillet extends Billet". På den måde har du 3 nedarvninger, som har "Billet"'s egenskaber, men hver deres egen pris, gebyr, afrejsepunkt, destination, og udskrivning af "datablad", og dette er en god øvelse, der samtidig demonstrerer hvad nedarvning drejer sig om: At lave en basisklasse, der hindeholder de egenskaber, der er fælles for alle nedarvede klasser, og som samtidig kan håndtere nedarvningernes unikke egenskaber.
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#3
abkold
Ny på siden
31-10-2013 14:04

Rapporter til Admin
Giver #2 ret, din nedarvning giver ikke mening. Her er der et lille eksempel med cykler. Mountain bike nedarver fra Bicycle: http://docs.oracle.com[...] Prøv at læse dette, nedarvning er ikke så svært.
--
#4
Gæsten
Gæst
31-10-2013 14:04

Rapporter til Admin
Please sig det ikke er BlueJ du bruger. Hvis det er vil jeg råde til at bruge noget andet. Godt nok er BlueJ lavet til undervisning, men jeg synes det gør et ret dårligt job til det. Jeg har blandt andet set folk bliver mere forvirret over BlueJ end hvis man bare var gået igang med almindelig programmering. Som #2 siger skal du have lavet en basisbillet og derefter extende den.
--
Gæstebruger, opret dit eget login og få din egen signatur.
#5
Ronnie
Gæst
31-10-2013 14:09

Rapporter til Admin
Tak for svar. En udmærket idé. Mit program, kan i forvejen de nævnte ting(mere eller mindre, dog uden nedarving). Jeg kunne rigtig godt tænke mig at lave en klasse, der bare nedarver de indtastede funktioner fra de andre klasser. Kan du give et eksempel? Så vil jeg prøve at udarbejde det.:)
--
Gæstebruger, opret dit eget login og få din egen signatur.
#6
Ronnie
Gæst
31-10-2013 14:12

Rapporter til Admin
Og formålet med en ny klasse ville bare være at udskrive data.:) Hvis bare jeg kan få 1 kort eksempel ift.#0, så er jeg kørende.
--
Gæstebruger, opret dit eget login og få din egen signatur.
#7
Gæsten
Gæst
31-10-2013 14:14

Rapporter til Admin
Der er allerede linket til eksempler...
--
Gæstebruger, opret dit eget login og få din egen signatur.
#8
NitroBlast
Monster Nørd
31-10-2013 14:19

Rapporter til Admin
Man kan komme langt her i livet, hvis man bruger hovedet, og gør en selvstændig indsats.
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#9
QuadCore
Semi Nørd
31-10-2013 14:40

Rapporter til Admin
What da.. det vil slet ikke give mening det der.. prøv at at tegne et klassediagram først, så kan du se dine klasser visuelt før du går igang med at kode... Kan se det er noget ticket system du er igang med.. så du kunne fx lave: Kunde som super klasse og så: Barn, Voksen, pensionist som subklasser.. Ideen med en super klasse er jo lidt at du kan nedarve variabler og metoder - så du ikke behøver at skrive dem flere gange.
--
#10
lizzy
Supporter
31-10-2013 15:15

Rapporter til Admin
#5 Hej, I programmering kalder man det metoder og ikke funktioner. Funktion er et matematisk begreb. Du kan dog lave funktioner, men dette vil ofte laves inde i en metode. Blot et lille hint. Vil foreslå dig at læse her om nedarvning: http://javabog.dk[...] Det beskriver det rimelig godt. Men et godt råd er at modellere tingene før man programmerer det. Det kan hjælpe meget.
--
D:
#11
NitroBlast
Monster Nørd
31-10-2013 15:21

Rapporter til Admin
#10 I al den tid, jeg har beskæftiget mig med programmering, har en funktion altid være en metode, der returnerer et resultat, og jeg har til dato ikke mødt en rigtig programmør, der kalder sine funktioner for metoder.
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#12
lizzy
Supporter
31-10-2013 15:53

Rapporter til Admin
#11 Det kommer vel an på sproget. Men jaja, lad det nu ligge.
--
D:
#13
NitroBlast
Monster Nørd
31-10-2013 16:04

Rapporter til Admin
#12 Nej, det er en "universel underforståelse". En metode er en subrutine, ofte del af et objekt. En procedure er en selvstændig programstump, der ikke giver et resultat, og en funktion er en selvstændig programstump, der giver et resultat (ofte på baggrund af nogle input-værdier). Metode: window.close(); Procedure: void ExitProcess(exitcode); Funktion: float sqrt(value);
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#14
lizzy
Supporter
31-10-2013 17:18

Rapporter til Admin
#13 Jeg takker for lærdommen, jeg må have misforstået noget. :)
--
D:
#15
bQnne
Guru
31-10-2013 19:09

Rapporter til Admin
#13 Java-folk kalder alle deres "metoder" for metoder. Det er rigtigt at andre sprog skelner mellem metoder, funktioner og procedurer, men Java-folket går ikke op i den slags. http://docs.oracle.com[...] Så ja, #14, du har misforstået noget, eller rettere, du har ikke lært andet. :)
--
http://tinyCode.dk[...]
#16
wizH
Mega Nørd
31-10-2013 19:11

Rapporter til Admin
Fra Stackoverflow: "A function is a piece of code that is called by name. It can be passed data to operate on (ie. the parameters) and can optionally return data (the return value). All data that is passed to a function is explicitly passed. A method is a piece of code that is called by name that is associated with an object. In most respects it is identical to a function except for two key differences. It is implicitly passed the object for which it was called It is able to operate on data that is contained within the class (remembering that an object is an instance of a class - the class is the definition, the object is an instance of that data)"
--
Bøh!
#17
Grydeskeen
Supporter
31-10-2013 19:12

Rapporter til Admin
#16 Jeg kan ikke helt se pointen med din post. Det er stort set det der er blevet skrevet før. Og jeg tror ikke rigtig man kan bruge SO som en faktuel kilde ligesom man ikke kan bruge wikipedia som en kilde.
--
#18
NitroBlast
Monster Nørd
31-10-2013 19:18

Rapporter til Admin
#15 Jamen Java er jo også 100% OOP, og dermed er der kun mulighed for at oprette metoder. Funktioner og procedurer kan slet ikke forekomme i Java.. Eller.. Noget.. ;-)
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#19
bQnne
Guru
31-10-2013 19:27

Rapporter til Admin
#16 Det ændrer ikke på at Java-folket er totalt ligeglade og kalder hele lortet for "methods". ;) #0 Det du har brug for, for at følge den tankegang du har nu, er at finde ud af hvad nedarvning reelt set går ud på. Så kommer resten som en leg. Tag et menneske som eksempel. Et menneske er et pattedyr som konstrueres på en bestemt måde. En hund er også et pattedyr. Hvad er forskellen på et menneske og en hund? Det lyder jo dumt at spørge om. Hvad er ligheden? Både mennesket og hunden kan fødes og dø. De kan indtage føde og omdanne dette til bæ, mildest talt. De kan formere sig. Det kan løver også. Løver er også pattedyr. Vi har altså 3 færdige udgaver af gruppen, eller superklassen, pattedyr, som på nogle punkter er ens, og på andre punkter er vidt forskellige. Klassen Pattedyr kan altså have metoder ved navn eatAndPoo, beBorn og die. Menneske, Hund og Løve kan nu nedarve (extends) denne superklasse Pattedyr, og arve pattedyrets egenskaber (metoder) direkte, uden at gentage kode. Metoden (egenskaben) buyBook er unik fordi det kun er mennesker - instanser af Menneske - der kan udføre dette. Metoden wagTheTail er tilgengæld noget kun hunde (instanser af Hund), osv.. Disse metoder er metoder du kan specificere yderligere i hver enkelt klasse. Pointen er at vi nu har en superklasse Pattedyr, som subklasserne Menneske, Hund og Løve nedarver og derfor kan bruge de metoder der er i superklassen (eatAndPoo f.eks.). Ydermere kan vi yderligere specificere at de enkelte klasser skal kunne noget helt specielt. Yderligere kan vi overskrive (override) metoderne fra superklassen nede i subklassen, hvis vi ønsker at noget andet skal ske. Køer tygger f.eks. Drøv, og kan derfor ikke anvende eatAndPoo-metoden direkte, da det kræver at dyret gylper maden op og spiser det igen. Når du har det på plads bør det være indlysende hvordan du kan lave en superklasse Billet, og to subklasser Voksenbillet og Børnebillet der arver nogle ting fra Billet, og har to forskellige egenskaber (f.eks. getFreeDonaldDuckMagazine til Børnebillet-klassen). Vend dig dog til at bruge engelske navne! Det er det, vi andre gør (vi andre = alle andre). #18: Det er korrekt. Men vi snakker jo om Java her. ;) #10 havde bare taget fejl af "Programmering" og "Java-programmering".
--
http://tinyCode.dk[...]
#20
bQnne
Guru
31-10-2013 19:36

Rapporter til Admin
#18 Ps.: Jeg glæder mig som et lille barn til vi får lambda-understøttelse. :D
--
http://tinyCode.dk[...]
#21
NitroBlast
Monster Nørd
31-10-2013 20:02

Rapporter til Admin
#20 Du kan ikke noget med lambda-udtryk, som du ikke kan allerede, så der er ikke noget reelt behov for det. Det risikerer bare at gøre koden mindre gennemskuelig og mere rodet. Men hvis du kan glæde dig som et barn til dét, så værsens-så-god :-)
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#22
bQnne
Guru
31-10-2013 20:09

Rapporter til Admin
#21 Det bliver kun mindre gennemskueligt hvis man ikke er indforstået med koden. Se kodeeksemplet på http://tinycode.dk[...] . Hvis du ikke ved hvad Runnable er for en størrelse, tager det lidt tid af gennemskue hvad der sker, men de tre linjer kode er da væsentligt pænere end tilsvarende syv linjer oven over. Det er i hvert fald min mening. Hvad funktionaliteten (get it?) angår skulle Java jo nødig komme til at ligne Scala ALT for meget!! ;)
--
http://tinyCode.dk[...]
#23
NitroBlast
Monster Nørd
31-10-2013 20:24

Rapporter til Admin
#22 Det kode du linker til er vist ikke helt gennemtænkt, vel? Der bliver i hvert fald ikke startet nogen threads :-/
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#24
bQnne
Guru
31-10-2013 20:28

Rapporter til Admin
#23 Jo da? Hvor mener du at den går galt? Nej, Java 8 er ikke ude endnu, så naturligvis vil lambda-eksemplet ikke virke endnu. Er det denne du mener?
--
http://tinyCode.dk[...]
#25
NitroBlast
Monster Nørd
31-10-2013 20:33

Rapporter til Admin
#24 Der bliver da ikke startet nogen threads i dine eksempler.. Runnable er en interface, der skal implementes i et objekt, der så skal bruges som parameter i en Thread: new Thread(r1).start(). Bare at kalde interface'ns run-metode duer ikke..
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#26
bQnne
Guru
31-10-2013 20:39

Rapporter til Admin
#25 Jo der gør: jeg implementerer jo interfacet i koden og derfor er den fin nok. Havde der stået "new Runnable();" var den skæv, ja. :)
--
http://tinyCode.dk[...]
#27
NitroBlast
Monster Nørd
31-10-2013 20:49

Rapporter til Admin
#26 Jamen "Runnable" er jo ikke nogen Thread - Runnable er en/et interface, som en Thread bruger til at udføre thread-kode.. For at din kode starter 2 threads, så skal: r1.run(); r2.run(); erstattes med: Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); t1.start(); t2.start(); eller bare: new Thread(r1).start(); new Thread(r2).start(); Selvom jeg ikke har kodet Java i >5 år, så er jeg ret sikker på dette..
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#28
Grydeskeen
Supporter
31-10-2013 20:55

Rapporter til Admin
#27 Der må jeg nok tilslutte mig din mening. Runnable interfacet bruges bare til at "gøre en klasse parat" til at blive kørt multithreaded.
--
#29
NitroBlast
Monster Nørd
31-10-2013 21:04

Rapporter til Admin
#28 Nemlig - for at det skulle give mening, så skulle "Runnable" erstattes af "Thread", og i stedet for "run()" skulle "start()" kaldes: Thread t1 = new Thread() { public void run() {System.out.println("Thread 1 is running");} }; t1.start(); eller sådan noget i den stil..
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#30
bQnne
Guru
31-10-2013 21:22

Rapporter til Admin
Ah, nu ved jeg hvad I mener... Jeg troede at du (NitroBlast) mente at koden var forkert mht- compile-/runtime-fejl. Forskellen på det I snakker om og ved at gøre det på den måde i den gamle kode, er at definere hvilken tråd der gør hvad. En annonym indre implementation af Runnable opretter ikke en ny tråd, men bruger hovedtråden til at udføre koden i. Det stemmer ikke helt 100% overens med hvad der står skrevet i teksten - dog er det ikke selve trådoprettelsen, der var essensen i indholdet på siden.
--
http://tinyCode.dk[...]
#31
Vilddingo
Ultrabruger
01-11-2013 00:44

Rapporter til Admin
Som alle andre skriver, så giver det ikke meget mening at alder nedarver fra børnebillet. Anyway, din alder klasse skal se sådan ud: http://pastebin.com[...] Din Alder method er lavet om til en contructor, som klader super contructoren.
--
Corsair HX 1000W - Radeon HD 5970 2GB - ASUS P6T X58 - Intel Core i7-920 - Corsair Dominator DHX+ DDR3 1600MHz 6GB - 2* OCZ Vertex turbo 60gb raid
#32
bQnne
Guru
01-11-2013 11:46

Rapporter til Admin
#31 Hvorfor oprette det nye lokale scope på linje 8 og 19? Det giver ikke problemer i dette tilfælde, men det kan det komme til, hvis man ikke er obs.
--
http://tinyCode.dk[...]
#33
NitroBlast
Monster Nørd
01-11-2013 13:19

Rapporter til Admin
#30 Du burde skrive, at koden er "explanatory", fordi at forklare noget med kode, der reelt ikke giver mening, og som aldrig (7-9-13, knock on wood) ville indgå i et reelt program virker uovervejet. Noget andet; vil din "r2" (der benytter lambda-override) ikke kræve, at "Runnable.run()"-metoden er markeret som "default" (default void run()), eller er det nok, at det er den eneste metode i interfacet? #31 Din kode giver IMO lige så lidt mening, og den demonstrerer ikke nedarvning. Det virker næsten som om folk slet ikke har forstand på at programmere, men bare kender lidt til kodesyntaksen, og derfor byder sig til med mere eller mindre uomsættelig / uanvendelig "hjælp"..
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#34
bQnne
Guru
01-11-2013 13:26

Rapporter til Admin
#33 Så vidt jeg har forstået er det nok at det er den eneste metode i interface't. Ret mig endelig hvis jeg tager fejl! Desuden giver det da fint mening - det er bare ikke så anvendeligt i praksis. Anonyme indre klasser er generelt ikke at foretrække, hvis man kan undgå dem. De fylder forfærdeligt, og det roder hurtigt. Et andet eksempel kunne være tilknytningen af en ActionListener til en knap, men igen: anonyme indre metoder er grimme i praksis! Desuden vil jeg bede dig skrive præcist hvad det er du mener, når du skriver som du gør, så jeg slipper for at gætte hvad du mener. ;)
--
http://tinyCode.dk[...]
#35
NitroBlast
Monster Nørd
01-11-2013 13:31

Rapporter til Admin
#34 Hvad er upræcist formuleret da?
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#36
bQnne
Guru
01-11-2013 13:40

Rapporter til Admin
#35: "Du burde skrive, at koden er "explanatory", fordi at forklare noget med kode, der reelt ikke giver mening, og som aldrig (7-9-13, knock on wood) ville indgå i et reelt program virker uovervejet." Det giver da i høj grad mening - det er bare ikke særligt anvendeligt i praksis. At koden ikke bør indgå i et konkret projekt giver jeg dig ret i. Kun i ganske få tilfælde giver det mening at skrive en tråd på den måde i et rigtigt projekt. Jeg tror dog du går for meget op i detaljerne og overser pointen med kodestykket.
--
http://tinyCode.dk[...]
#37
NitroBlast
Monster Nørd
01-11-2013 13:54

Rapporter til Admin
#36 Som "explanatory" kode er det glimrende - hvis det er oplyst. Men når du skriver: "initiate a good old thread", og henviser til nogle linier kode, der tilkendegiver at "Thread X is running", uden at en Thread initieres, så begynder jeg (som koder) at spørge mig selv, om tekst og kode passer sammen, eller om der er sket en cut'n'paste-fejl, og så mister eksemplet sin validitet. Men sådan er vi så forskellige - folk der ikke kender til Runnable's og Thread's lægger sikkert slet ikke mærke til, at koden er et eksempel, der ikke vil forekomme i reel programmering :-) P.S: Det er konstruktiv kritik og ikke jantelov, ringeagt eller mobning.
--
http://xlinx.dk[...] i7 2600K, 16GB PC3-12800, GA-X68XP-UD4 R1, GTX 560Ti HAWK
#38
bQnne
Guru
01-11-2013 14:13

Rapporter til Admin
#37 Af underlige årsager var ændringerne jeg foretog i går ikke publicerede. concrete5 er et glimrende CMS, men man skal lige holde det i ørene nogle gange!! ;) Giv den en F5'er
--
http://tinyCode.dk[...]

Opret svar til indlægget: Java og nedarving - hjælp søges

Grundet øget spam aktivitet fra gæstebrugere, er det desværre ikke længere muligt, at oprette svar som gæst.

Hvis du ønsker at deltage i debatten, skal du oprette en brugerprofil.

Opret bruger | Login
NYHEDSBREV
Afstemning