HEJ! Litet enkelt exempel som visar hur du kan göra: Kan inte VB.Net tillräckligt bra för att uttala mig om något om språket, men rent generellt är det en dålig idé att låta en klass använda en annan på det sättet. Tackar för exemplen och snabba svar! Varför är det dåligt? Vad har du för argument? JAg lyssnar gärna på din åsikt. Men om du bar säger att något är dåligt tycker jag du också skall berätta varför. jag ser inte heller vad som skulle vara dåligt med det.. <code> >Varför är det dåligt? Vad har du för argument? JAg lyssnar gärna på din åsikt. Men om du bar säger att något är dåligt tycker jag du också skall berätta varför. <b>Varför vill du att Lådorna skall komma åt Rummen?</b> Jo, visst; ok... Tackar åter för alla snabba svar! Bra att du känner att det är löst, men jag tror ändå att mycket är onödigt hårt kopplat. När en låda behöver veta vilka rum som fins är det väl bättre att skicka med en kollektion med alla rum som ett argument. Detta är väl ett mer objekt orienterat sätt att göra det. Det mest objektorienterade hade förmodligen varit att inte skicka med nånting till någon av klasserna; att de inte skulle behöva känna till varandra överhuvudtaget; och det är därför jag vill se hela problemställningen. Detta med LÅDOR och RUM är bara ett litet teoretisk exempel. Det jag är ute efter är att lära mig OO-programmering. Hur talar du då om till vilket rum en låda hör eller vilka låder som finns i et rum? Då är första frågan vad som är rimligast; att alla Rum behöver ha vetskap om en Låda eller om varje Låda behöver ha vetskap om ett Rum. Det här var en rolig diskussion! Om du tvunget från en Låda vill veta vilket Rum den tillhör så kan du ju lägga på en extra property i klassen låda som heter "Parent" eller "Rum". När du skapar en låda i klassen Låda så skriver du samtidigt vilket rum den tillhör... LÅDAKlasskompisar?
Kan man på ett enkelt sätt göra K2 känd i K1?
/Alexander
(kom inte på någon bättre rubrik)
<code>
Main Sub
Dim K1 as new KLASSA
Dim K2 as new KLASSB
End Sub
Public class KLASSA
Public Värde as string
End class
Public class KLASSB
Public Värde as string
End class
</code>Sv: Klasskompisar?
<code>
Main Sub
Dim K1 as KLASSA = New KLASSA
Dim K2 as KLASSB = New KLASSB
Set K1.Buddy = K2
End Sub
Public class KLASSA
Public Värde as string
Public Buddy As KLASSB
End class
Public class KLASSB
Public Värde as string
End class
</code>
Om du vill endast göra egenskapen läsbar:
<code>
Main Sub
Dim K2 as KLASSB = New KLASSB
Dim K1 as KLASSA = New KLASSA(K2)
End Sub
Public class KLASSA
Public Värde as string
Private mBuddy As KLASSB
Sub New(Buddy As KLASSB)
Set mBuddy = Buddy
End Sub
Public ReadOnly Property Buddy() As KLASSB
Get
Return mBuddy
End Get
End Property
End class
Public class KLASSB
Public Värde as string
End class
</code>
Dett fins ingen skillnad mellan att skriva:
<code>
Dim K2 as New KLASSB
</code>
Och:
<code>
Dim K2 as KLASSB = New KLASSB
</code>
Som jag förståt det. Däremot tycker jag det framkommer tydligare vad man gör om man använder likamed.
Har inte tillgång till VB.NET så jag har ingen möjlighet att testa för syntaxfel. Men principen framgår.Sv: Klasskompisar?
Vad är det du vill uppnå?
Oftast kan det finnas bättre sätt att uppnå det utan att använda friend eller public.Sv: Klasskompisar?
Det är nog något sådan som jag är ute efter.
Ett litet nytt exempel/fråga:
Min huvudtråd skapar:
100st instanser av klassen RUM
100st instanser av klassen LÅDOR
Nu vill jag att alla instanser av klassen RUM skall kunna komma åt alla instanser av LÅDOR
Hade jag programmerat detta hade RUM skickat en EVENT till huvudtråden som i sin tur hade frågat alla LÅDOR. Sedan skickat svar till LÅDA
Men något kanske har något bättre/riktigare sätt!
Kanske skall göra något liknade som i exemplen i tidigare inlägg?
/AlexanderSv: Klasskompisar?
Sv: Klasskompisar?
ta bara windows forms tex.
där har alla kontroller/fönster en publik .Parent property som pekar på ett annat objekt.
//RogerSv: Klasskompisar?
arraylist lådor =new arraylist();
arraylist rum=new arraylist();
for (int i =0;i<100;i++)
{
Låda l=new Låda();
lådor.add(l);
}
for (int i=0;i<100;i++){
Rum r=new Rum();
r.Lådor=lådor;
rum.add(r);
}
</code>
eller
<code>
arraylist lådor =new arraylist();
arraylist rum=new arraylist();
for (int i =0;i<100;i++)
lådor.add(new Låda());
for (int i=0;i<100;i++)
rum.add(new Rum(lådor));
</code>
det borde väll lösa det hela , utan att skicka några events eller så...
//RogerSv: Klasskompisar?
Känd OO-princip; ju mer man öppnar åt andra, ju större chans att det blir fel. Låter man bli så mycket öppenhet som möjligt så blir klassena fristående och det ger en stark modularitet, vilket i sin tur gör det lättare att underhålla, utveckla och felsöka. Dessutom blir de återanvändbara.
Men för att återkomma till grundfrågan: Varför vill du att Lådorna skall komma åt Rummen?
ATT låta de komma åt varandra är i sig inget problem, men VARFÖR?
Behövs det verkligen?
Är de så fast knutna till varandra att en förändring i lådor MÅSTE ge upphov till en förändring i rum, och vice versa?Sv: Klasskompisar?
-----------------
<b>100st instanser av klassen RUM
100st instanser av klassen LÅDOR
Nu vill jag att alla instanser av klassen RUM skall kunna komma åt alla instanser av LÅDOR</b>
det är väll rummen som ska ha en lista över alla lådor och inte lådorna som ska komma åt rummen?
eller?
//RogerSv: Klasskompisar?
Men frågan kvarstår: varför?
Vad behöver rummen lådorna till?
Är det bara en algoritm är en oo-lösning kanske inte lämplig. Och är en oo-lösning lämplig så bör man överväga om en sån design är nödvändig.Sv: Klasskompisar?
När man som amatör sitter och funderar/testar så blir man lite osäker på om man tänker rätt programmeringsmässigt. Många säger att "Funkar det så är det rätt" men jag vill lära mig att använda allt på rätt/bästa sätt.
Så jag har inget emot att göra som jag har gjort!
Varför lådorna skall komma åt rummen?
Tex ifall lådan vill kolla om det finns ett bättre rum.
Men en sådan grej skull man nog skriva i en ny klass?!
/Alexander
Ps Tycker att det är väldigt bra att man får så mycket hjälp här när man leker som amatör... och utan någon utbildning DsSv: Klasskompisar?
Skulle gärna vilja ha en mer utförlig beskrivning på problemet, vad det är du vill uppnå.Sv: Klasskompisar?
Sv: Klasskompisar?
Sv: Klasskompisar?
Men det vore snällt om någon hade tid att beskriva hur man skulle lösa detta OO.
Skapa 100 RUM
Skapa 100 LÅDOR
LÅDORNA skall flyttas till det lägsta rums nummret om plats finnes.
Kanske ett löjligt exempel men jag kanske lär mig hur man skall lägga upp programmet OO och snyggt.Sv: Klasskompisar?
Sv: Klasskompisar?
Båda lösningarna är rimliga i varsitt sammanhang. I detta fallet låter det bäst med att Rummen känner till Lådor, men inte vice versa.
Då låter du varje Rum ha en referens till en låda.
Hur du löser
>LÅDORNA skall flyttas till det lägsta rums nummret om plats finnes.
är en helt annan fråga. Är det rimligt att tala om en samling rum, där man sätter in lådor, eller är det en funktion som sätter i lådor i ett givet antal rum.
I och med att problemet är rent hypotetiskt är det svårt att ge argument. Om du kommer med ett "riktigt" exempel är det mycket lättare.Sv: Klasskompisar?
Det är ofta så att diskussioner om OO har en tendens att bli väldigt filosofiska. "Vet en låda vilket rum den står i?"... "Jag tänker, alltså finns jag"... etc... :-)
Ofta är det nyttigt att jämföra med den verklighet som klasserna skall efterlikna. I så fall kanske varken lådor eller rum vet om varandra (och framförallt, de vet INGENTING om varandras metoder eller implementationer, ett rum kan ju inte flytta på en låda, det är det ju en gubbe (eller gumma) som gör), och istället har du ett dictionary som kopplar rum och lådor till varandra.
Men tänker man lite till så blir det kanske yxigt att programmera (och förstå för den som ska underhålla), och sett i det perspektivet är det väl bäst att t.ex. rummet har en lista på lådor som står i det, samt metoder för att bära in och ut lådor.
Slutligen, om du har miljoner lådor och rum, kanske man av prestandaskäl vill bryta mot "koppla så löst som möjligt"-principen, och även låta varje låda veta vilket rum den står, för att man i själva "affärslogiken" (där man gör något nyttigt med lådor och rum) inte skall behöva göra en dyrbar sökning efter vilket rum en låda står i, om nu logiken kräver det.
/Göran RoseenSv: Klasskompisar?
Sv: Klasskompisar?
--------------------
string Innehåll
int Size
---------------------
RUM
----------------------------
int Nr
int Size
Lådor[] Lådor
-----------------------------
LäggTillLåda(Låda låda)
----------------------------
vad du nu måste göra är att du skapar 100 unika lådor med olika storlekar, vilket var vad du önskade dig. (Kul uppgift :-) )
Sedan skapa 100 st rum med olika rumsnummer samt storlekar.
Ex Rum[] rum = new Rum[100];
Om du implementerar CompareTo samt Compare metoderna (Använd interface IComparable,IComparer) så kan köra en sorterin efter rummsnummer. Då du själv bygger hur rumen skall sorteras så kan du ju lägga rumet med minst nummer på index 0 och sedan öka. Då är det bara att göra en loop genom alla lådorna och lägga till dem, i din LäggTillLåda kollar du om de får plats, du måste alltså använda dig av Size i båda klasserna för att se så de får plats, då det blir fullt slänger du ut en exception eller struntar i att spara fler lådor.
Om du inte vill köra IComparable,IComparer så kan du ju altid bygga din egna lilla rutin (linjär sökning) som går genom rum efter rum o kollar vilket rum som har minst rumsnummer.
Placerar du dock rumsnummer i storleksordning med en gång (vid skapandet av ett RUM objekt) är det ju ännu lättare att göra det du vill.
//Johan N