Avatar billede wired Nybegynder
06. oktober 2008 - 09:23 Der er 14 kommentarer og
1 løsning

Hvordan kan/bør to klasser tale sammen

Jeg har to klasser (ikke objecter) som jeg gerne vil have til at tale sammen (bruge hinandens variabler).

Er det typisk noget man undgår og/eller eksistere der et mønstre for dette?
Avatar billede aaberg Nybegynder
06. oktober 2008 - 10:19 #1
Når du skriver det er klasser, og ikke objekter, du vil have til at tale sammen, går jeg ud fra at det er statiske klasser du mener.

Du skal bare sørge for at de variabler/properties/metoder som skal kunne bruges fra den anden klasse, er public. Så kan du tilgå dem direkte.
Avatar billede wired Nybegynder
06. oktober 2008 - 10:25 #2
Nix heller ikke statiske.

Jeg vil gerne have fat i variabler(metoder) i den ene klasse, fra den anden klasse.
Avatar billede lasserasch Juniormester
06. oktober 2008 - 10:32 #3
Øhh, en klasse er da et objekt! Eneste måde en klasse efter hvad jeg ved, ikke er et objekt på, er når man bruger struct (som jeg aldrig rigtig har kunnet se fidusen i).

Et objekt (klasse) kan have en reference til et andet objekt (klasse), og derved kan man fra en klasse hente værdier sat i en anden klasse. Men det kræver at man opretter en reference fra A til B vha. Objekt Referencenavn = new Objekt();

Ellers kan man definere sine properties/variabler som "Static". Hvis man gør det, så kan værdierne trækkes fra A til B uden at oprette reference til objektet.

Sample Kode:

public class Objekt1
{
private string Brugernavn
{
  get
  {
  return Objekt2.Username;
  }
}
}

public class Objekt2
{
  public static string Username;
}
Avatar billede lasserasch Juniormester
06. oktober 2008 - 10:36 #4
Ok, kom vist lidt for sent med mit indlæg, sorry...

Men forskellen er vel ikke så stor. Du kan jo bare lave dine metoder statiske. Men det er altså ikke verdens bedste løsninger man får når man bruger statiske objekter eller metoder. Du frigiver dem jo aldrig fra hukommelsen igen før applikation afsluttes.
Avatar billede aaberg Nybegynder
06. oktober 2008 - 10:41 #5
Hvis du skal bruge funktionalitet fra en klasse uden at oprette instanser, bliver du nød til at gøre funktionaliteten statisk. Der er ingen anden måde at gøre det på!

Hvis jeg har misforstået spørgsmålet, så tror jeg du bliver nød til at forklare din problemstilling lidt bedre.
Avatar billede wired Nybegynder
06. oktober 2008 - 10:44 #6
Er et object ikke en instans af en klasse og derfor ikke det samme.

statiske variable kunne som aaber og skriver være det jeg bliver nød til at bruge, havde bare håbet på en bedre løsning - evt. en mønstre.
Avatar billede wired Nybegynder
06. oktober 2008 - 10:45 #7
ups det skulle have stået "som aaberg_cc også skriver"
Avatar billede aaberg Nybegynder
06. oktober 2008 - 10:54 #8
Det er rigtigt at en instans og et objekt er det samme.

Hvis du har metoder/properties som skal kunne bruges, uden at der oprettes en instans af klassen, er at gøre dem statiske den eneste løsning.
Avatar billede wired Nybegynder
06. oktober 2008 - 10:55 #9
ok aaberg det må jeg leve med. send et svar.
Avatar billede aaberg Nybegynder
06. oktober 2008 - 11:01 #10
:-)
Avatar billede crazysnap Seniormester
06. oktober 2008 - 11:38 #11
Hej wired,

Hvis du ikke vil have dine klasser statiske kan du implementere dem ved hjælp af et singleton pattern. På den måde kan du tilgå dem som var de statiske, sammentidigt med der eksiterer én instans af dem. Altså:

public class A
{
    //Singleton pattern, kun en instans af A kan eksistere.
    public static readonly A Instance = new A();

    public string EnStreng;

    //Privat default constructor (så singleton mønstret opretholdes).
    private A() {}

    public void CallB()
    {
        B bInstans = B.Instance;

        //A sætter en member variabel i B
        bInstans.EnInt = 100;

        //Kald en metode i B
        bInstans.CallA();
    }
}


public class B
{
    //Singleton pattern, kun en instans af B kan eksistere.
    public static readonly B Instance = new A();

    public int EnInt;

    //Privat default constructor (så singleton mønstret opretholdes).
    private B() {}

    public void CallA()
    {
        A aInstans = A.Instance;

        //B sætter en member variabel i A
        aInstans.EnStreng = "B kaldte A";
    }
}

Men alt efter hvad din applikation skal udføre, er ovenstående ikke nødvendigvis en optimal løsning. I det hele taget lyder det ikke som et gennemført design hvis to klasser er nødsaget til at dele variable gennem statiske metoder og members (ment venskabeligt). Men hvis du er ny indenfor C# og OO kan det fint være vejen frem at prøve lidt forskelligt af stille og roligt. :)

Mvh.
CS
Avatar billede wired Nybegynder
06. oktober 2008 - 12:20 #12
Perfekt crazysnap. Jeg syntes nok at der var noget med et mønstre(pattern) til netop det formål, men kunne ikke finde det.

Mange tak. send et svar. Er det ok, hvis I deler points?
Avatar billede crazysnap Seniormester
06. oktober 2008 - 12:40 #13
Det var så lidt og glad for jeg kunne hjælpe. Tildel du bare aaberg_cc pointene, jeg samler ikke. :)

Mvh.
CS
Avatar billede wired Nybegynder
06. oktober 2008 - 12:49 #14
Ja og karma kan du heller ikke får.. hmm. Mange tak alligevel.
Avatar billede aaberg Nybegynder
06. oktober 2008 - 13:35 #15
Wikipedia har en god artikel om "singleton pattern".
http://en.wikipedia.org/wiki/Singleton_pattern
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester