Permalänk
Medlem

Ruby, klassfunderingar

Tjenare
Skulle behöva lite hjälp med klass-struktur och subklasser i ruby, och så här hade jag tänkt att lägga upp det.

class A class B < A class C < B class D < B

..och det jag undrar är alltså:

  1. Tanken är att C samt D är separata objekt som endast används av B. Innebär "C < B" att det endast är B som har tillgång till att använda dessa, eller kan även A göra det? A är nämligen en klass som hanterar B men har inget att göra med varken C eller D.

  2. Enligt god programmeringssed så ska ju klasser placeras i separata filer med samma namn. Gäller detta även subklasser? (har inte sysslat med OOP i så stor utsträckning)

  3. När jag försöker skapa subklasser genom att lägga till "<" så får jag följande felkod "uninitialized constant Object::MyObject (NameError)". Jag gissar mig till att det beror på att superklassen inte har blivit inläst än. Men vad gör jag åt detta? Jag kan ju självklart läsa in superklassen först, men då uppstår ju precis samma problem då jag använder subklassen i superklassen. Jag vet att i andra programmeringsspråk så definierar man ju funktioner och klasser i headerfiler som man inkluderar för att berätta att funktionerna och klasserna faktiskt finns, men hur funkar det egentligen i ruby?

Skulle uppskatta så utförliga svar som möjligt, väldigt länge sedan jag programmerade överhuvudtaget så jag är extremt ringrostig.

Ska fundera om jag kan formulera mig lite bättre, så det är möjligt att jag redigerar något.
Tack på förhand!

Visa signatur

"Allt du säger skall vara sant, men du behöver inte säga allt som är sant" - Göran Persson

Permalänk
Medlem
Skrivet av iNi:
  1. Tanken är att C samt D är separata objekt som endast används av B. Innebär "C < B" att det endast är B som har tillgång till att använda dessa, eller kan även A göra det? A är nämligen en klass som hanterar B men har inget att göra med varken C eller D.

"C < B" innebär att C ärver av B. Detta är en del av polymorfism, och man kan tänka sig att B är till exempen "fordon" och C är "bil" för att få ett hum om vad detta innebär. C är alltså ett sorts underobjekt till B. Det har inget att göra med vad B "har tillgång till", eller vad som "har tillgång till" C.

Skrivet av iNi:
  1. Enligt god programmeringssed så ska ju klasser placeras i separata filer med samma namn. Gäller detta även subklasser? (har inte sysslat med OOP i så stor utsträckning)

Beror på språket. I C++ (och obj-C, Java, C#, etc) så är det så det fungerar. Men i Ruby (vad jag fått för mig i alla fall) brukar man istället hålla en modul per fil. Lita inte på mig till 100% på den punkten.

Skrivet av iNi:
  1. När jag försöker skapa subklasser genom att lägga till "<" så får jag följande felkod "uninitialized constant Object::MyObject (NameError)". Jag gissar mig till att det beror på att superklassen inte har blivit inläst än. Men vad gör jag åt detta? Jag kan ju självklart läsa in superklassen först, men då uppstår ju precis samma problem då jag använder subklassen i superklassen. Jag vet att i andra programmeringsspråk så definierar man ju funktioner och klasser i headerfiler som man inkluderar för att berätta att funktionerna och klasserna faktiskt finns, men hur funkar det egentligen i ruby?

Du ska absolut inte använda en subklass i superklassen. Det är dålig design. För att ta bilexemplet igen, ett "fordon" ska inte behöva veta vad en "bil" (ett specialiserat fordon) är för att fungera. I övrigt finns det i Ruby inget som stoppar dig från att patcha en klass i efterhand (detta är en stor fördel i vissa situationer), vilket gör att du kan göra ungefär så här:

class B < A # Ingenting end class C < B # Ingenting end class B # Alla definitioner i B end class C # Alla definitioner i C end

Men som sagt, superklassen ska aldrig behöva använda subklassen. Du borde nog läsa på lite om OOP-konceptet innan du fortsätter, för det låter inte riktigt som att du greppat det fullt ut.