Just nu i M3-nätverket
Gå till innehåll

Class som typ


Miky

Rekommendera Poster

Har programmerat i VS2008 ett tag nu och snubblat över en, enligt mig, konstig detalj.

 

Jag har ett upplägg som följer i mitt program (Förenklad för att enklare kunna visa):

Public Class cla_textValue_String
''Kod för att lagra, analyzera värdet m.m.
End Class

Public Class chauffor
   Property personnummer() As cla_textValue_String
       Get
           Return _personnummer
       End Get
       Private Set(ByVal value As cla_textValue_String)
         ''Kod där jag kontrollerar värdet som förs in
         _personnummer = value
       End Set
   End Property
End Class

Men det är när jag anropar denna property som jag stöter på något intressant:

Public Class Main
       Dim chaf As New databaseChauffor(txtBox_Personnummer.Text)

       'Ex: 1
       'Går direkt till cla_textValue_String. 
       chaf.personnummer.value = txtBox_Personnummer.Text

       'Ex: 2
       'Genererar ett fel: "'Set' acessor of property 'personnummer' is not accessible."
       chaf.personnummer = New cla_textValue_String(txtBox_Personnummer.Text)
End Class

 

Exempel 1

I ovan exempel 1 så hade jag förväntat mig att den först skulle gå genom chauffor.personnummer property för att sedan genom den gå vidare till cla_textValue_String. Vilket då betyder att jag inte har någon större anledning till att sätta en "Private Set".

 

Exempel 2

När jag sedan testar med exempel 2 ovan så noterar jag att mitt "Private Set" faktiskt fungerar. Den tillåter mig inte att ändra personnumret. Dock så börjar man undra, går den då och ändrar värdet genom "Get"? (Och ja, den ändrar värdet. Har kollat detta) Har även haft "Property personnummer" satt till Readonly med samma resultat som ovan.

 

Någon som vet hur det kommer sig att den beter sig på detta sätt?

 


 

Det som jag skulle vilja är att kunna lägga upp det hela på detta sätt:

Public Class chauffor
   Property personnummer() As cla_textValue_String <------ Notera typ
       Get
           Return _personnummer
       End Get
       Private Set(ByVal value As String) <------ Notera typ
         ''Kod där jag kontrollerar värdet som förs in
         _personnummer.value = value
       End Set
   End Property
End Class

Som ni ser så vill jag bara kunna ge den ett värde, men samtidigt kunna plocka hem all info som cla_textValue_String har att erbjuda. Fast ovan exempel ger ju tyvärr ett error. Så jag var tvungen att lösa det på nedan sätt:

Public Class chauffor
   ReadOnly Property personnummer() As cla_textValue_String
       Get
           Return _personnummer
       End Get
   End Property
   WriteOnly Property setPersonnummer() As String
       Set(ByVal value As String)
           _personnummer = New cla_textValue_String(value)
       End Set
   End Property
End Class

Någon som har en idé om hur man kan lösa det hela på ett bättre sätt?

Eller är min lösning det bästa man kan göra?

Jag kan dock fortfarande från Class Main ändra värdet direkt genom att skriva:

chaf.personnummer.value = txtBox_Personnummer.Text

Länk till kommentar
Dela på andra webbplatser

Hmmm... gjorde ett snabbt test i C# och det verkar som att egenskaper som har en private set på sig inte går att ändra på. Men egenskaper till dessa går att ändra på.

 

Dock är jag lite fundersam till dina objekt. Vad fyller cla_stringValue för funktion? Varför inte låta Personnummer vara en string och sköta validering av personnumer i egenskapen?

Länk till kommentar
Dela på andra webbplatser

Anledningen till att jag har cla_textValue_String är att jag vill kunna sätta fler värden i anslutning till just denna variabel. Alltså värden som t.ex. anger hur just denna sträng senare ska skrivas ut. Samt även kod för att hjälpa till med felhantering.

 

Man kan ju visserligen göra en function som man anropar när man ska föra in och ut informationen, men det kändes i min värld som enklare att lägga in den så att det sköttes automatiskt.

 

Sen kan jag även tillägga att jag hade tänkt ha inmatningskontrollen i just chauffor.personnummer property. Det var därför som jag upptäckte ovan detalj.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...