Hej! Det bästa är nog att göra så som du säger, att skicka med huvudklassen. De vet ju nämligen ingenting om varandra annars... En variant är att göra den där variabeln statisk, men om du då har flera instanser av huvudklassen så har du skaffat dig huvudvärk... Det kanske är den bästa lösningen... vad vet jag? Jag bara tycker att koden blir så "smutsig" när man har det så, man skickar med så mycket mer information än vad som behövs om man skickar med hela huvudklassen. <b>Räcker det inte att skicka över ViktigInt till konstruktorn?</b> August Jag kan inte bara skicka över ViktigInt till sub klassens konstruktor eftersom den hela tiden ändras, typ 100 ggr i sekunden. Och jag kan inte ha viktigint som en parameter till EnFunktion() ( = void EnFunktion(int ViktigInt) ) eftersom koden som anropar kommer ifrån subklass. August. Du har nog rätt i det du säger. Bara det att jag kan inte komma på nåt annat sätt att skriva koden. Jag har bara en fråga, brukar du aldrig skicka med classen där objectet skapas till objectets kontruktor som ett argument? August . Kan du inte implementera en event listener i din subklass och registrera listenern i din master class så kan master klassen notifiera alla listeners när en uppdatering av viktig int har skett? Har lurat er lite granna.... :) Viktig int är i skälva verket en function. Så här; jag skickar med ett object till en konstruktor för att kunna komma åt dess functioner, grejjen är att jag skickar med den klassen som skapar objectet till objectets konstruktor. (Det object jag pratar om e hela tiden samma, blev en virrig text) I vilket fall betyder det att jag skapar en del object så här: Mojjsen hej = new Mojjsen(this, 56, 765); Till exempel asså. är det vanligt? Är det fel i mitt tänkande om inkapsling? Är viktigInt static? ViktigInt var inte hela sanningen, det var ett tag sen jag programmerade i det projectet och jag blandade ihop saker, men problemet är fortfarande kvar... Fast ViktigInt är en funktion... Hej Skulle det inte kunna vara idé att köra med nästlade klasser? Om Motor bara används inne i Car, så finns det väl ingen anledning att ha den fristående?Objekt Åtkomst
Jag stöter ofta på "problemet" att jag behöver komma åt en variabel i en övre klass från ett nästlat objekt. Kanske låter konstigt, här är ett kod exempel:
<code>
public class MasterClass
{
private SubClass sub;
//Detta är en viktig int som ändras ofta och som är mycket viktig för EnFunktion()
private int ViktigInt;
}
public class SubClass
{
//Eftersom denna funktion är private och att den ändå bara anropas från andra funktioner som inte har tillgång till "ViktigInt" finns det ingen mening med att göra den public
private void EnFunktion()
{
//ViktigInt behövs för dom avancerade beräkningarna här
}
}
</code>
Hur ska jag göra för att EnFunktion() ska få tillgång till ViktigInt hela tiden utan att behöva skicka med hela MasterClass till SubClass's konstruktor? För att sedan göra ViktigInt public och sedan komma åt den så här i SubClass:
<code>
public class SubClass
{
private MasterClass mc;
public SubClass(MasterClass mc)
{
this.mc = mc;
}
//Eftersom denna funktion är private och att den ändå bara anropas från andra funktioner som inte har tillgång till "ViktigInt" finns det ingen mening med att göra den public
private void EnFunktion()
{
//ViktigInt behövs för dom avancerade beräkningarna här
EnAnnanInt = mc.ViktigInt * 47598;
}
}
</code>
Att behöva skicka med en masterclass är ju inte särskilt smidigt... Finns det ingen bättre lösning på detta? Jag stöter på det hela tiden!!Sv: Objekt Åtkomst
Sv: Objekt Åtkomst
Sv: Objekt Åtkomst
Tycker jag låter bäst hitills. Subclass borde ju inte behöva ha någon kännedom om MasterClass, utan det enda den verkar behöva är ju integern. Sv: Objekt Åtkomst
Du använder din sub klass i en metod i din Masterklass? då kan du i din EnFunction bara ta en inputparameter där du skickar in din ViktigInt då MasterClassen har tillgång till dess värde.
<code>
public class MasterClass
{
private SubClass sub;
//Detta är en viktig int som ändras ofta och som är mycket viktig för EnFunktion()
private int ViktigInt;
private void GörNått()
{
sub.EnFunction(ViktigInt);
}
}
public class SubClass
{
public void EnFunction(int viktigtInt)
{
//Gör saker...
}
}
</code>
Om SubKlassen gör saker som är starkt relaterade till Master klassen kan du lika gärna skita i att skapa en Sub klass och lägga EnFunktion i Master klassen i stället.
<code>
public class MasterClass
{
//Detta är en viktig int som ändras ofta och som är mycket viktig för EnFunktion()
private int ViktigInt;
public void EnFunction(ViktigInt)
{
//Gör nått...
}
}
</code>
Då jag inte vet vad du vill göra är det svårt att säga exakt hur du skall bygga. Du har i ditt kod ex satt SubKlass i Master som global? varför? någon spec syfte? du väljer att ha en SubKlass som har en funktion som du troligen kunnat lägga i MasterClass. Dock svårt att veta då du säkerligen kommer ha andra namn än de du angett. Så på ett sätt kan du inte ställa frågan som du gör då vi inte vet vad du tänkt ha det till. Kan mycket väl vara så att du skall skivka Master klassen in i Sub eller kanske to m sätta ViktigInt som en property. Kanske to m så att din viktig int kan sättas i en enitet som du skickar runt...
Mvh JohanSv: Objekt Åtkomst
Vi kan nog inte komma fram till nån bra lösning nu, bara tänkte att någon kanske kände igen sig i mitt problem. Och att ta fram ett exempel skulle ta en sjudundrans :P massa tid eftersom det är ett så stort program... (spel) Det närmar sig 6000 rader kod nu... >_<Sv: Objekt Åtkomst
När man fastnar i sådana frågor som du just nu gjort, måste man tyvärr i många fall omstrukturera koden. Refactorera den, ändra det betéende den har. Det hela kan handla om bristande förståelse över hur man egentligen ville att det skulle fungera. Att då lösa fast sig och göra en massa workarrounds m.m. skapar bara oreda i koden, onödig kod och till slut spagetti.
Jag har säket vart med om ditt problem, men har då oftast gjort någon omstrukturering. Dock anser jag att ditt problem är inte bara det lilla du talar om utan ännu större då du har ett mer komplext system runt om (Spelet) som ställer krav på saker och ting. I ditt fall är det mer att du vill skapa en hamburgare utan att du vet dess ingridienser och frågar om någon kan hjälpa dig utan att denna vet avad du vill ha på. Jag förstår mycket väl att du inte kan slänga ut en massa exempel då det säkerligen ligger en uppsats bakom varför du vill ha det som du vill ha det. Mitt tips är att du ser genom så du inte tänkt fel, kolla om du kan justera eller flytta saker, om det inte går gör det som ger dig en fungerande lösning.
Jag hoppas det löser sig.
Mvh JohanSv: Objekt Åtkomst
Sv: Objekt Åtkomst
Hej, jag skickar absolu tmed klasser in i kontrusktorer iböand, beror helt och hållet på varför, om jag kör delegate, (inter delagets utan använder klassens metode i klassen typ... ) eller så är det entiteter jag skickar in, klasser med data som jag nyttjar för funktionalitet. Ibland skickar jag även med klasser in för att sedan be klassen som tog emote dem att skicka dem vidare, proxy klasser eller något liknande. Det beror helt och hållet på vad jag vill komma åt och vad berättelsen berättar.
mvh JohanSv: Objekt Åtkomst
/NilsSv: Objekt Åtkomst
Sv: Objekt Åtkomst
Kan du inte ge ett exempel på när du använder det och hur det ser ut i kod?
/NilsSv: Objekt Åtkomst
<code>
public class Car
{
private Motor motor;
public Car()
{
motor = new Motor(this);
BRAKAPÅ();
}
private void BRAKAPÅ()
{
while(1)
{
motor.BULLEROCHBRAK();
}
}
public void BULLER()
{
//DENNA FUNCTION ANVÄNDS AV MÅNGA NÄSTLADE KLASSER I CAR, MEN DEN KAN INTE VARA STATISK FÖR DEN ANVÄNDER OSTATISKA MEDLEMMAR
//Mycket buller
}
}
public class Motor
{
private Car car;
public Motor(Car car)
{
this.car = car;
BULLEROCHBRAK();
}
public void BULLEROCHBRAK()
{
car.BULLER();
}
}
</code>
Kom ihåg att detta är ett klent exempel. Men det är ungefär så här koden är uppbyggd, bara att det är andra namn i riktiga.
PROBLEMET:
Det är just denna kodraden jag funderar över:
<code>
motor = new Motor(this);
</code>
Är det rätt att göra så bara för att komma åt ett par funktioner i basklassen (motor vill komma åt funktioner i this (car))?!?!?Sv: Objekt Åtkomst
Jag skulle nog göra så, men det beror lite på hur vad det är för objekt och vad objektet har för "ansvar" i programmet. Men jag skulle nog skapa ett interface IBuller så att du kan använda klassen på fler ställen.
Men lite fel känns det dock mest för att bullerochbrak bara ropar på car.buller().
Kanske buller ligger i fel klass? Kanske skapa en ny klass där du skickar in all de sakerna som bullrar. Och när det bullrar så bullrar allesammans.. mycket buller blir det..
Alternativ så skulle jag använda mig av events eller subscriber/publisher (som gör samma som events) tillsammans med interface
Lite patterns som kanske kan vara intressanta
http://www.dofactory.com/patterns/PatternChain.aspx
http://www.dofactory.com/patterns/PatternObserver.aspxSv: Objekt Åtkomst