Avatar billede Skynet Mester
02. juni 2008 - 20:41 Der er 9 kommentarer og
2 løsninger

Gennerelt om klasser privat vs public

Hej,

Hvordan kan det være at man i en klasse vælger først at have nogle private variabler og nogle public metoder?

private int numberOfSeats;


public int NumberOfSeats
        {
     
              get { return numberOfSeats; }
              set { numberOfSeats = value; }
       
        }

hvorfor ikke bare lave  private int numberOfSeats; til public og så slette "public int NumberOfSeats"?
Avatar billede arne_v Ekspert
02. juni 2008 - 20:48 #1
Fordi:
  * private field + public property giver dig mulighed for senere at tilfoeje
    funktionalitet til get og set uden at det kraver aendringer i koden der kalder dem
  * properties supporterer polymorphisme fiels goer ikke
Avatar billede arne_v Ekspert
02. juni 2008 - 20:48 #2
Noegleordet er "encapsulation"
Avatar billede Slettet bruger
02. juni 2008 - 21:11 #3
I version 3.5 (og måske også version 3.0) af .Net frameworket kan du også angive en property som:

public int NumberOfSeats{get; set;} - men rent teknisk nede bagved ligger de stadig med private fields og public properties. Men ellers enig med Arne - der er også en række ting vedr. data-binding, der gør public fields til en rigtig dårlig ide.

Null-pointer exceptions er en anden ting, der gør public fields til en dårlig ide.
Avatar billede arne_v Ekspert
02. juni 2008 - 21:18 #4
Det er foerst med 3.5.
Avatar billede Skynet Mester
02. juni 2008 - 21:20 #5
ok tak.. hvad med forms er det muligt at lave en genvej så man ikke behøver at lave de public var her:

public partial class Form1 : Form
    {
public s = "test";

Men at jeg kan gå direkte til min void eller andet, og så gøre det public her istedet?

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
           
          //Public?
          string s = "Skal bruges som public";
        }
Avatar billede Slettet bruger
02. juni 2008 - 22:01 #6
Det vil end ikke compile, som du har skrevet det der.

public partial class Form1 : Form
{
...
  public string s {get; set;}

  private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
  {
      this.s = "Public værdi";
  }
}

Herefter vil du kunne få fat i strengen ved hjælp af Form1.s.

Hvis du istedet skal have det til at ske 'automatisk', skal du lave eventhandlers/delegates til det.

Grundlæggende er spørgsmålet - hvad er formålet med din public string? Skal den tilgås fra andre klasser, eller skal andre klasser gøres opmærksom på når strengen ændres?
Avatar billede Skynet Mester
02. juni 2008 - 22:45 #7
Når den er public, kan alle klasser så ikke automatisk tilgå den?, jeg kunne godt tænke mig at lære hvordan andre klasser kan gøres opmærksom på når strengen ændres, Er det nemt?
Avatar billede Skynet Mester
02. juni 2008 - 23:05 #8
Idet hovedproblemet i tråden nu er løst giver Jer begge points..
Avatar billede arne_v Ekspert
03. juni 2008 - 03:06 #9
Alle kan tilgå noget der er public og static bare via klassenavnet.

Alle kan tilgå noget der er public men ikke static via en instans af klassen.

Og et svar fra mig.
Avatar billede Slettet bruger
03. juni 2008 - 11:56 #10
Og et svar herfra. For at svare kort på dit spørgsmål skal du lave en delegate og en eventhandler på din form, som andre klasser kan abonnere på. Det kræver dog at det er en property, så du har mulighed for at fyre eventet, når værdien ændrer sig.

Søg på Google omkring INotifyPropertyChanged - det er et interface, som gør det nemt for andre klasser at lytte på værdien.
Avatar billede Skynet Mester
03. juni 2008 - 13:18 #11
ok, tak for hjælpen..
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