webForumDet fria alternativet

fel med readonly property

.NETur .NET

7 svar · 303 visningar · startad av Jymdis

Medlem sedan mars 20016 260 inlägg
Frågan#1
Public Class Anställda

    Protected fnamn, lnamn As String

    Public ReadOnly Property namn() As String
        Get
            Return fnamn & " " & lnamn
        End Get
    End Property

    Public Overridable Function VisaLoen(ByVal fnamn As String, ByVal lnamn As String, ByVal val1 As Single, ByVal val2 As Single) As String
        Return namn()

    End Function

End Class

Public Class TimAnställd

    Inherits Anställda

    Private timleon As Single
    Private antalTimmar As Single

    Public Overrides Function VisaLoen(ByVal fnamn As String, ByVal lnamn As String, ByVal val1 As Single, ByVal val2 As Single) As String
        timleon = val1
        antalTimmar = val2
        Return "Namn: " & namn() & " Lön: " & Berekna(antalTimmar, timleon)
    End Function

    Private Function Berekna(ByVal antalTimmar As Single, ByVal timleon As Single) As Single

        Return antalTimmar * timleon

    End Function

End Class

Varför blir namn() tomt?
lnamn och fnamn har värde (kollat i debugern så dom har det)

Medlem sedan okt. 20023 030 inlägg
#2

Säkert att det här inte gäller .Net? :q

Medlem sedan mars 20016 260 inlägg
#3

Jag är säker på att det gör det, men förra gången jag la det i .net blev det flyttat till VB.

Medlem sedan okt. 20023 030 inlägg
#4

Jag är helt säker på att det här inte är VB utan .Net. Försök där igen och om någon moderator flyttar det igen får du väl fråga av vilken anledning. :)

Medlem sedan mars 20016 260 inlägg
#5

Eller så väljer du bara rapportera till moderatorn å ber honom flytta tråden istället för att skriva det i tråden?

Medlem sedan juli 20011 304 inlägg
#6

Du sätter aldrig dina klassvariabler till något värde men det är dem som du returnerar. Du blir lurad i debuggern eftersom du har samma namn på dina inparametrar till Berekna.

Jag tycker att strukturen ser lite underlig ut dessutom. Vad vill du åstadkomma?

Du löser i all fall problemet genom att göra så här:

Public Class Anställda
    Protected m_fnamn, m_inlnamn As String

    Public ReadOnly Property namn() As String
        Get
            Return m_fnamn & " " & m_inlnamn
        End Get
    End Property

    Public Overridable Function VisaLoen(ByVal fnamn As String, ByVal lnamn As String, ByVal val1 As Single, ByVal val2 As Single) As String
        Me.m_fnamn = fnamn
        Me.m_inlnamn = lnamn
        Return namn()

    End Function

End Class

Public Class TimAnställd
    Inherits Anställda

    Private timleon As Single
    Private antalTimmar As Single

    Public Overrides Function VisaLoen(ByVal fnamn As String, ByVal lnamn As String, ByVal val1 As Single, ByVal val2 As Single) As String
        Me.m_fnamn = fnamn
        Me.m_inlnamn = lnamn
        timleon = val1
        antalTimmar = val2
        Return "Namn: " & namn() & " Lön: " & Berekna(antalTimmar, timleon)
    End Function

    Private Function Berekna(ByVal antalTimmar As Single, ByVal timleon As Single) As Single

        Return antalTimmar * timleon

    End Function

End Class

Men jag tycker att du ska ha en konstruktor istället smat kanske ärva både TimAnställd och Anställda från Person. Något i den här stilen skulle jag nog göra (beroendes lite på vad du vill)

Public Class Person
    Protected m_fnamn, m_inlnamn As String

    Public Sub New(ByVal fnamn As String, ByVal lnamn As String)
        Me.m_fnamn = fnamn
        Me.m_inlnamn = lnamn
    End Sub

    Public ReadOnly Property Namn() As String
        Get
            Return Me.m_fnamn & " " & Me.m_inlnamn
        End Get
    End Property

End Class

Public Class Anställda
    Inherits Person

    Protected m_manadslon As Single

    Public Sub New(ByVal fnamn As String, ByVal lnamn As String, ByVal manadslon As Single)
        MyBase.New(fnamn, lnamn)
       
        Me.m_manadslon = manadslon
    End Sub

    Public ReadOnly Property Lon() As String
        Get
            Return Me.m_manadslon.ToString()
        End Get
    End Property

    Public Function VisaLoen() As String

        Return Namn() & " " & Lon()

    End Function

End Class

Public Class TimAnställd
    Inherits Person

    Private m_timleon As Single
    Private m_antalTimmar As Single

    Public Sub New(ByVal fnamn As String, ByVal lnamn As String, ByVal antalTimmar As Single, ByVal timleon As Single)
        MyBase.New(fnamn, lnamn)
        Me.m_antalTimmar = antalTimmar
        Me.m_timleon = timleon
    End Sub

    Public Function VisaLoen() As String
        Return "Namn: " & Namn() & " Lön: " & Berekna()
    End Function

    Private Function Berekna() As Single

        Return Me.m_antalTimmar * Me.m_timleon

    End Function

End Class

sen kan du skapa olika personer och använda dom, typ:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim manads As New Anställda("Petter", "Oskarsson", 20000)

        TextBox1.Text = manads.VisaLoen()

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim timmis As New TimAnställd("Kalle", "Kula", 160, 220)

        TextBox2.Text = timmis.VisaLoen()
    End Sub
Medlem sedan mars 20016 260 inlägg
#7

Tackar så muchos :)

Medlem sedan apr. 20012 266 inlägg
#8

Flyttas från ASP.NET

137 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)