Vinnaren i pepparkakshustävlingen!
2016-09-12, 21:39
  #1
Medlem
Har stött på det här med Context i t.ex. sånt som
public void paint (Graphics g)
:
g.drawString("blabla")

eller i android
Intent intent = new (this,Blabla.class)

Och sen kollar man stackoverflow och får alla möjliga käcka utläggningar om "den omgivning som något skall funka i" osv. Bullshit som inte förklarar något för en under geninivå. Vad man vill veta är: Hur används detta när koden exekveras?
I första exemplet : vad kommer "g" verkligen vara för något då funktionen exekveras och hur kommer g användas
I androidexemplet, hur kommer "this" verkligen att användas då man gör en StartActivity? Verkar onödigt, det är väl bara att gå till den klass som skall startas?

Alltså inte abstakt, utan exakt. Hur kommer en kontext att användas?

Skriver det där med 125 för att det är det jag brukar få i alla såna tester, fattar programmering och liknande fort, men tar inte automatiskt till mig sådant som "callback", "objekt" osv. Tycks bara vara de som är riktigt vassa som fattar detta omedelbart. De som är mer i mitten skiter i att ställa den här frågan, bara gör som det står i kokböckerna... enligt min erfarenhet.
Citera
2016-09-12, 22:43
  #2
Moderator
Neksnors avatar
I första metoden:
Metoden paint tar som parameter ett objekt av typen Graphics, den parametern kallas g.

Graphics är en abstrakt (abstract) klass, vilket innebär att man inte kan skapa objekt av den typen, men klassen definierar diverse grundegenskapen hos klasser som ärver (extends) Graphics. Tänk dig den klasserna abstract Building och House extends Building, du kan inte skapa något som bara är en building, men du kan skapa hus och ett hus är en byggnad. I klassen Buildnig kan man lägga egenskaper som är gemensamma för alla byggnader, exempelvis antalFönster(). De egenskaperna ärv sedan av bland annat House och House kan ha en egen implementering av de olika metoderna, men om det inte finns används "defaultmetoden" i Building. Att lämplig metod existerar kontrolleras vid kompilering, men väljs vid körning.

Tillbaka till Graphics. Parametern g, som kan minst allt som ett Graphicsobjekt kan, har en metod som heter drawString, den metoden anropas för objektet g.

Om vi fortsätter med husen så kan vi tänka oss metoden unlockHouse() som låser upp ytterdörren. Då vi kan ha flera hus så måste vi tala om vilket hus vi ska låsa upp, alltså för vilket objekt metoden ska anropas. ex h.unlockHOuse(), vilket låser upp huset h, men inget annat hus (om det är ordentligt kodat, sidoeffekter kan förekomma, medvetet eller omedvetet).

Det handlar alltså om att det endast är objektet g som ska beröras av metodanropet.
Nu råkar metoden drawString vara abstract, så den kan göra lite vad man vill, men enligt javadoc* ska den "Draws the text given by the specified string, using this graphics context's current font and color."

https://docs.oracle.com/javase/7/doc.../Graphics.html
Citera
2016-09-14, 08:35
  #3
Medlem
Citat:
Ursprungligen postat av Neksnor
I första metoden:
Metoden paint tar som parameter ett objekt av typen Graphics, den parametern kallas g.

Graphics är en abstrakt (abstract) klass, vilket innebär att man inte kan skapa objekt av den typen, men klassen definierar diverse grundegenskapen hos klasser som ärver (extends) Graphics. Tänk dig den klasserna abstract Building och House extends Building, du kan inte skapa något som bara är en building, men du kan skapa hus och ett hus är en byggnad. I klassen Buildnig kan man lägga egenskaper som är gemensamma för alla byggnader, exempelvis antalFönster(). De egenskaperna ärv sedan av bland annat House och House kan ha en egen implementering av de olika metoderna, men om det inte finns används "defaultmetoden" i Building. Att lämplig metod existerar kontrolleras vid kompilering, men väljs vid körning.

Tillbaka till Graphics. Parametern g, som kan minst allt som ett Graphicsobjekt kan, har en metod som heter drawString, den metoden anropas för objektet g.

Om vi fortsätter med husen så kan vi tänka oss metoden unlockHouse() som låser upp ytterdörren. Då vi kan ha flera hus så måste vi tala om vilket hus vi ska låsa upp, alltså för vilket objekt metoden ska anropas. ex h.unlockHOuse(), vilket låser upp huset h, men inget annat hus (om det är ordentligt kodat, sidoeffekter kan förekomma, medvetet eller omedvetet).

Det handlar alltså om att det endast är objektet g som ska beröras av metodanropet.
Nu råkar metoden drawString vara abstract, så den kan göra lite vad man vill, men enligt javadoc* ska den "Draws the text given by the specified string, using this graphics context's current font and color."

https://docs.oracle.com/javase/7/doc.../Graphics.html

Så, rent konkret, om jag bara skriver ut texten på skärmen i nåt fönster, vad kommer det vara för ett objekt som är g?
Citera
2016-09-14, 09:12
  #4
Medlem
inneskos avatar
Citat:
Ursprungligen postat av Kokoluring
Så, rent konkret, om jag bara skriver ut texten på skärmen i nåt fönster, vad kommer det vara för ett objekt som är g?

g är ett object som har skapats av javas awt bibliotek och som skickas till din metod genom ett vanligt funktionsanrop.
Citera
2016-09-14, 21:14
  #5
Medlem
Citat:
Ursprungligen postat av Kokoluring
eller i android
Intent intent = new (this,Blabla.class)

...

I androidexemplet, hur kommer "this" verkligen att användas då man gör en StartActivity? Verkar onödigt, det är väl bara att gå till den klass som skall startas?

Alltså inte abstakt, utan exakt. Hur kommer en kontext att användas?
En context är som du redan fått svaret på: "den omgivningsom något skall funka i".
För Android så kan vi kika på klassen Intent.
Där ska man skicka in "packageContext - Context: A Context of the application package implementing this class."
Går man vidare till Context: https://developer.android.com/refere...t/Context.html
"Interface to global information about an application environment."

Det är alltså via Contexten man kommer åt applikationen och alla resurser som finns tillgängliga. Utan den så går det inte att göra något eller få någon information om applikationen. Om man bara skulle konstruera en aktivitet så har den inte tillgång till något vettigt. Det går nog inte ens att rita upp en aktivitet utan att gå via contexten.

Alla Activity och Service implementerar Context och därför skickar man oftast in this för att starta ett Intent.

Metoden startActivity() ligger i klassen Context så this (som är Contexten) kommer garanterat användas för det går inte att anropa startActivity() på något annat sätt: https://developer.android.com/refere...ontent.Intent).
__________________
Senast redigerad av e7andy 2016-09-14 kl. 21:16.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback