Свойства не присваиваются, не могут возвращать значения из Private, поскольку все они равны нулю (0) - PullRequest
0 голосов
/ 25 апреля 2020

Не все свойства назначаются правильно. Еще два свойства работают. Теперь я знаю об автокоррекции Publi c ReadOnly, но я предпочитаю старый метод get / set, потому что он помогает мне понять более тщательно. У меня есть в отдельном файле другой класс BusinessLogi c:

Public Class BusinessLogic
    Private _totalPiecesOfAllUsers As Integer
    Private _totalCountOfUsers As Integer
    Private _totalEarningsOfAllUsers As Decimal
    Private _totalAverageOfAllUsers As Decimal
    Private _name As String
    Private _pieces As String
    Private _individualEarning As Decimal

    Public Property TotalPiecesOfAllUsers() As Integer
        Get
            Return _totalPiecesOfAllUsers
        End Get
        Set
            _totalPiecesOfAllUsers += _pieces
        End Set
    End Property

    Public Property TotalCountOfUsers() As Integer
        Get
            Return _totalCountOfUsers
        End Get
        Set
            _totalCountOfUsers = value
        End Set
    End Property

    Public Property TotalEarningsOfAllUsers() As Decimal
        Get
            Return _totalEarningsOfAllUsers
        End Get
        Set(ByVal value As Decimal)
            _totalEarningsOfAllUsers = value
        End Set
    End Property

    Public Property TotalAverageOfAllUsers() As Decimal
        Get
            Return _totalAverageOfAllUsers
        End Get
        Set(ByVal value As Decimal)
            _totalAverageOfAllUsers = value
        End Set
    End Property

    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

    Public Property Pieces() As Integer
        Get
            Return _pieces
        End Get
        Set(ByVal value As Integer)
            _pieces = value
        End Set
    End Property

    Public Property IndividualEarning() As Decimal
        Get
            Return _individualEarning
        End Get
        Set(ByVal value As Decimal)
            _individualEarning = value
        End Set
    End Property

End Class

И затем моя форма Form1

  Private Sub CalcPayToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CalcPayToolStripMenuItem.Click

    Try
        ' Create Object
        Dim blog As New BusinessLogic
        If tbName.Text <> String.Empty And tbPieces.Text <> String.Empty Then

            ' Get Transactions Per User
            blog.Name = tbName.Text
            blog.Pieces = Integer.Parse(tbPieces.Text)
            blog.IndividualEarning = CalculatePieces(blog.Pieces)

            ' Counter Per User
            blog.TotalCountOfUsers += 1

            ' Get Total of all users
            blog.TotalPiecesOfAllUsers += blog.Pieces
            blog.TotalEarningsOfAllUsers += blog.IndividualEarning
            blog.TotalAverageOfAllUsers += (blog.TotalEarningsOfAllUsers / blog.TotalCountOfUsers)
        Else
            ' SHow error if field is empty
            MsgBox("Name and/or Piece count required")
        End If

        ' Assign asmount earned txtbox the calculated value
        lblAmountEarned.Text = FormatCurrency(blog.IndividualEarning)

    Catch exc As Exception
        ' Show error if triggered
        MsgBox("Error processing data, values may be empty or incorrect.")
    End Try
End Sub

Public Function CalculatePieces(ByVal p As Decimal) As Decimal
    ' For piece claculation 
    Dim earningsByPiece As Decimal = 0D

    ' If pieces fall within range 1-199 
    If p >= 1 And p <= 199 Then
        earningsByPiece = p * 0.5
        ' If pieces fall within range 200-399
    ElseIf p >= 200 And p <= 399 Then
        earningsByPiece = p * 0.55
        ' If pieces fall within range 100-599
    ElseIf p >= 400 And p <= 599 Then
        earningsByPiece = p * 0.6
        ' If pieces fall out of 600 range
    ElseIf p >= 600 Then
        earningsByPiece = p * 0.65
    End If
    Return earningsByPiece
End Function

Каким-то образом он возвращает IndividualEarning, но когда я устанавливаю перерыв в BusinessLogi c, ни один из vraiables ничего не держит.

1 Ответ

1 голос
/ 25 апреля 2020

Вы начали не с той ноги. Перерабатывая этот код, я бы начал с класса User. Я добавил пользовательский конструктор, чтобы вы могли добавить нового пользователя в одну строку кода. Затем я добавил конструктор по умолчанию.

Public Class User
    Public Property Name() As String
    Public Property Pieces() As Integer
    Public Property IndividualEarning() As Decimal

    Public Sub New()

    End Sub

    Public Sub New(nme As String, pcs As Integer, earnings As Decimal)
        Name = nme
        Pieces = pcs
        IndividualEarning = earnings
    End Sub
End Class

Затем я создал класс бизнес-логики c для хранения остальной информации. Свойства Shared, поэтому они являются одинаковыми при обращении к классу. Нет необходимости создавать экземпляр при доступе к общим членам. Просто обратитесь к ним с именем класса.

Public Class BL
    Public Shared Property TotalPiecesOfAllUsers() As Integer
    Public Shared Property TotalCountOfUsers() As Integer
    Public Shared Property TotalEarningsOfAllUsers() As Decimal
    Public Shared Property TotalAverageOfAllUsers() As Decimal
End Class

Затем в Form я создал List(Of User) для хранения ваших пользовательских объектов. Теперь, когда вы создаете пользователя, даже если u выпадает из области видимости, пользователь благополучно скрывается в списке с помощью метода .Add.

Каждый раз, когда вы настраиваете содержимое список вы звоните CalculateTotalsAndAverage, чтобы держать ваш BL класс в курсе.

Dim lst As New List(Of User)

Private Sub CalcPayToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CalcPayToolStripMenuItem.Click
    'Validate input
    If tbName.Text = "" Then
        MessageBox.Show("Please enter a name")
        Exit Sub
    End If
    Dim pcs As Integer
    If Not Integer.TryParse(tbPieces.Text, pcs) Then
        MessageBox.Show("Please enter a valid number of pieces")
        Exit Sub
    End If
    Dim u As New User
    u.Name = tbName.Text
    u.Pieces = pcs
    u.IndividualEarning = CalculatePieces(pcs)
    lst.Add(u)
    CalculateTotalsAndAverage()
    lblAmountEarned.Text = FormatCurrency(u.IndividualEarning)
End Sub

Public Function CalculatePieces(ByVal p As Integer) As Decimal
    Dim earnings As Decimal = 0D
    Select Case p
        Case 1 To 199
            earnings = p * 0.5D
        Case 200 To 399
            earnings = p * 0.55D
        Case 400 To 599
            earnings = p * 0.6D
        Case Else
            earnings = p * 0.65D
    End Select
    Return earnings
End Function

Private Sub CalculateTotalsAndAverage()
    BL.TotalAverageOfAllUsers = lst.Average(Function(u) u.IndividualEarning)
    BL.TotalPiecesOfAllUsers = lst.Sum(Function(u) u.Pieces)
    BL.TotalCountOfUsers = lst.Count
    BL.TotalEarningsOfAllUsers = lst.Sum(Function(u) u.IndividualEarning)
    Debug.Print($"Average {BL.TotalAverageOfAllUsers} Total Pieces {BL.TotalPiecesOfAllUsers} Total Earnings {BL.TotalEarningsOfAllUsers}")
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...