Avatar billede joergensh Nybegynder
13. juni 2005 - 23:36 Der er 10 kommentarer

Egenskabsprocedurer - formål med dem?

Hej igen! Jeg har 3 specifikke spørgsmål jeg meget gerne vil have besvaret:

1.
Hvorfor er det overhovedet nødvendigt at have egenskabsprocedurer? Man kan vel bare bruge variable som repræsentant for en egenskab?

2.
Bruger man kun egenskabsprocedurer i forbindelse med klassemoduler, eller kan man også bruge dem i andre sammenhænge, hvor man bare har et formmodul/standardmodul?

3.
Når man fx. skriver

public property get person()
person = person_navn
end property

så kan man læse egenskaben person sådan:

(objektnavn).person

men hvis man nu ikke har lavet et objekt, men kun en egenskabsprocedure, hvad sætter man så ind i stedet for objektnavn...er det navnet på formen?

Jeg har nemlig følgende eksempel:

---------------------formmodul 1-------------------------

Option Explicit

Private Sub Command1_Click()
  frmDialog.Show
End Sub

Private Sub Command2_Click()
  frmDialog.Overskrift = Text1.Text
  frmDialog.Sekunder = Text2.Text
End Sub

Private Sub Form_Load()
    Load frmDialog
End Sub

------------------------------------------------------------

----------------------formmodul 2 --------------------------
Option Explicit
Private nSekunder As Integer, nSlut As Integer

Public Property Get Sekunder()
  Sekunder = nSekunder
End Property

Public Property Let Sekunder(vNewValue)
  nSlut = vNewValue
  nSekunder = 0
End Property

Public Property Let Overskrift(vNewValue)
  txtShow.Text = vNewValue
  frmDialog.Refresh
End Property

Private Sub Form_Activate()
Timer1.Enabled = True
Timer1.Interval = 1000
nSekunder = 0
End Sub

Private Sub Form_Load()
  frmDialog.Overskrift = ""
  nSekunder = 0
  nSlut = 0
End Sub

Private Sub Timer1_Timer()
  nSekunder = nSekunder + 1
  Label1.Caption = nSekunder
  If nSekunder >= nSlut Then
    Timer1.Enabled = False
    frmDialog.Hide
  End If
End Sub

--------------------------------------------------------------

det er 2 vinduer, hvor den ene styrer den anden. Kan I forklare mig hvad man bruger følgende til:

Public Property Get Sekunder()
  Sekunder = nSekunder
End Property

for hvis jeg fjerner det sker der fuldstændig det samme!



Tak for hjælpen!
Avatar billede driis Nybegynder
14. juni 2005 - 00:01 #1
Property'en er en indkapsling af feltet nSekunder.
Det gør at du kan læse værdien fra andre klasser, men ikke skrive til det.
Avatar billede driis Nybegynder
14. juni 2005 - 00:06 #2
Ad 1)
Det er ikke nødvendigt at have Egenskaber, men det kan være praktisk. Det er en meget basal ting i OOP. Indkapslingen gør, at du får lejlighed til at køre noget kode før Sekunder returneres. Eksempelvis kunne man forestille sig at du ønskede at opdatere værdien eller lignende. I dit eksempel bruges det blot til at give læse-adgang, men ikke skrive-adgang til feltet. Hvis din klasse f.eks. modellerer en timer der måler sekunder, giver det ikke nødvendigvis mening at man kan sætte værdien af sekunder. Generelt, indkapslingen er med til at gøre den klassens abstraktion så komplet som mulig.
Avatar billede nielle Nybegynder
14. juni 2005 - 09:27 #3
Ad 1.

Det er skam slet ikke nødvendigt, men det er en af de grundlæggende principper i OOP, hvor det går under betegnelsen ”encapsulation” (indkabsling).

Nogle fordele:

1) Man kan senere ændre den indre implementation uden at skulle ændre interfacet til omverdenen. Dermed skal man ikke til at tilrette alle de klasser som afhænger af denne klasse.
2) Du kan gøre din property til read-only i forhold til omverdenen...
3) ... eller write-only.
4) I forbindelse med at du manipulere din property kan du samtidigt udføre anden kode. Et eksempel kunne være at du havde en indre Integer variabel i din klasse som kun må have værdier over 0. Denne variabel kan eksponeres til omverdenen via en property. Når nogen forsøger at sætte propertyen til en negativ værdi så ignoreres dette simpelthen og ellers så sættes variablen til den nye værdi.
5) Du kan have en meget kompleks indre datastruktur. Denne gøres synligt via nogle simple properties ud af til. Et eksempel kunne være en lænket liste hvor du internt har brug for at kunne sætte elementer ind eller tage dem ud. I sprog som C++ ville dette involvere en masse pointer-gymnastik som ikke er vigtig set udefra. Udefra ville man kun have brug for nogle simple properties som ListHeader og ListTail etc.

Ad 2.

Man kan bruge properties hver eneste gang at man har en klasse.
Avatar billede joergensh Nybegynder
14. juni 2005 - 10:11 #4
tak nielle og driis. Nielle har man ikke en klasse, hvis bare man har en form eller en kontrol, for de er jo bygget ud fra en klasse?


Nogen der kan besvare det første i 3'eren?

3.
Når man fx. skriver

public property get person()
person = person_navn
end property

så kan man læse egenskaben person sådan:

(objektnavn).person

men hvis man nu ikke har lavet et objekt, men kun en egenskabsprocedure, hvad sætter man så ind i stedet for objektnavn...er det navnet på formen?
Avatar billede ube1 Nybegynder
14. juni 2005 - 12:46 #5
En form er et klasse-modul, så svaret på spg. 3 er at du bruger formens navn.

F.eks.:
Form1.person
Avatar billede nielle Nybegynder
14. juni 2005 - 15:09 #6
14/06-2005 10:11:47> Så vidt jeg ved har du faktisk en klasse. Du laver den godt nok ikke selv, men når compileren behandler din kode så er noget af det første netop at pakke formen ind som en klasse.

Dette er godt nok en oplysning mere af en ren teknisk karakter - jeg er ikke sikker på at det er noget du kan bruge praktisk.
Avatar billede martin_moth Mester
20. juni 2005 - 10:44 #7
ad 3. (hvis jeg forstår spørgsmålet)

Egenskaben .person er en egenskab/property der hører til et objekt. Opretter du ikke en instans af et objekt, der hører til den class hvori du har defineret .person, kan .person ikke bruges.
Avatar billede nielle Nybegynder
24. juni 2005 - 19:27 #8
Lukketid?
Avatar billede nielle Nybegynder
11. juli 2005 - 19:55 #9
?
Avatar billede nielle Nybegynder
27. november 2007 - 22:36 #10
Lukketid?!
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
Kurser inden for grundlæggende programmering

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