与 Class 共享值并通过 属性 返回值

Sharing Values With a Class And Returning A Value Via Property

我不认为我能够很好地解释自己,如果这没有意义,我很抱歉。

下面的示例有两个函数可以执行一些工作正常的计算:

Sub Example()

    Dim mValue = Multiply(2, 2)
    Dim dValue = Divide(2, 2)

End Sub

Function Multiply(ByVal value1 As Double, ByVal value2 As Double) As Double
    Return value1 * value2
End Function

Function Divide(ByVal value1 As Double, ByVal value2 As Double) As Double
    Return value1 / value2
End Function

虽然我想做的是类似于下面的事情(这不起作用,但希望这能证明我正在尝试做的事情)。我想与 class 共享参数,然后 select 和 属性 共享参数 return 一个值,例如类似于 DataGridView1.Item(1, 1).Size。有点像 属性 里面的 属性,但我搜索了那个 return 没有任何好的结果。

Sub example2()

    Dim mValue = Values(2, 2).Multiply()
    Dim dValue = Values(2, 2).Divide()

End Sub

Public Class Values

    Public Shared _Value1, _Value2 As Integer

    Public Sub New(ByVal Value1 As Double, ByVal Value2 As Double)

        _Value1 = Value1
        _Value2 = Value2

    End Sub

    Public Shared ReadOnly Property Multiply() As Double

        Get
            Return _Value1 * _Value2
        End Get

    End Property

    Public Shared ReadOnly Property Divide() As Double

        Get
            Return _Value1 / _Value2
        End Get

    End Property

End Class

我认为我正在尝试做的事情是可能的,我只是觉得我遗漏了一些小东西。任何帮助或指导都会很棒!

您需要决定是要使用 Shared 成员还是实例成员。您有一个不是 Shared 的构造函数,这意味着您需要创建一个实例,您可以使用 New 关键字来创建实例。如果您创建一个实例,那么您需要实例成员才能访问该实例:

Public Class Values

    Private value1 As Integer
    Private value2 As Integer

    Public Sub New(value1 As Integer, value2 As Integer)
        Me.value1 = value1
        Me.value2 = value2
    End Sub

    Public Function Multiply() As Integer
        Return value1 * value2
    End Function

    Public Function Divide() As Double
        Return value1 / value2
    End Function

End Class
Sub Example()
    Dim values = New Values(2, 2)
    Dim product = values.Multiply()
    Dim quotient = values.Divide()
End Sub

另一种方法是使用所有 Shared 成员而不创建实例。数据通过 Shared 属性输入并通过 Shared 方法输出:

Public Class Values

    Public Shared Property Value1 As Integer
    Public Shared Property Value2 As Integer

    Public Shared Function Multiply() As Integer
        Return Value1 * Value2
    End Function

    Public Shared Function Divide() As Double
        Return Value1 / Value2
    End Function

End Class
Sub Example()
    Values.Value1 = 2
    Values.Value2 = 2

    Dim product = Values.Multiply()
    Dim quotient = Values.Divide()
End Sub

在第一种情况下,您将在要使用它的地方创建一个 Values 实例,而创建不同实例的任何其他代码都不会对此产生影响。在第二种情况下,因为 class 只有一组属性,您可以将它们设置在一个地方,然后在第二个地方将它们设置为其他东西,然后在第一个地方调用一个方法并期望使用第一组 属性 值的结果。只有一组字段,这些方法将始终使用分配给它们的最后一个值,无论发生在代码的何处。

还值得注意的是,如果您正在考虑定义一个包含所有 Shared 成员的 class,您可能应该改为定义一个模块。模块在幕后编译为 classes,它们本质上会阻止您创建实例,因此模块成员的行为类似于 Shared class 成员。区别在于您不必使用模块名称限定模块成员,而您必须限定 Shared class 成员。有些人不喜欢那样,并错误地认为它违反了 OOP 的规则。如果您愿意,您仍然可以限定模块成员,但是 classes 强制您这样做。

如果您想要单行代码,那么您可以同时使用实例成员和 Shared 成员,但它们看起来会有些不同。如果您正在使用实例成员,那么您需要一个实例,因此您必须调用一个构造函数。不过,没有必要保留该对象。您可以使用它并根据需要将其丢弃,例如

Dim product = New Values(2, 2).Multiply()

不过,如果您对相同的数字执行多个操作,那会有点浪费,因为您将创建多个相同的实例,例如

Dim product = New Values(2, 2).Multiply()
Dim quotient = New Values(2, 2).Divide()

如果您正在使用 Shared 成员,那么您必须重载方法以允许您传入或不传入值:

Public Class Values

    Public Shared Property Value1 As Integer
    Public Shared Property Value2 As Integer

    Public Overloads Shared Function Multiply() As Integer
        Return Value1 * Value2
    End Function

    Public Overloads Shared Function Multiply(value1 As Integer, value2 As Integer) As Integer
        Values.Value1 = value1
        Values.Value2 = value2

        Return Multiply()
    End Function

    Public Overloads Shared Function Divide() As Double
        Return Value1 / Value2
    End Function

    Public Overloads Shared Function Divide(value1 As Integer, value2 As Integer) As Double
        Values.Value1 = value1
        Values.Value2 = value2

        Return Divide()
    End Function

End Class

您可以在调用方法或使用现有值时传入新值,例如

Dim product = Values.Multiply(2, 2)
Dim quotient = Values.Divide()

如有遗漏请指正,我在这里创建class库

Namespace calulation

    Public Class Operations

        Private i_v1 As Integer
        Private i_v2 As Integer

        Private obj_mul As Multiply
        Private d_value As Double
        Public ReadOnly Property Multiply As Double
            Get
                obj_mul = New Multiply(i_v1, i_v2)
                d_value = obj_mul.GetValues
                Return d_value
            End Get
        End Property

        Private obj_divide As Divide
        Public ReadOnly Property Divide As Double
            Get
                obj_divide = New Divide(i_v1, i_v2)
                d_value = obj_divide.GetValues
                Return d_value
            End Get
        End Property

        Public Sub New(ByVal v1 As Integer, ByVal v2 As Integer)


            i_v1 = v1
            i_v2 = v2



        End Sub
    End Class

    Public Class Multiply


        Private Shared s_value1 As Integer
        Private Shared s_value2 As Integer
        Public Sub New(ByVal v1 As Integer, ByVal v2 As Integer)

            s_value1 = v1
            s_value2 = v2
        End Sub
        Public Function GetValues() As Double
            Return s_value1 * s_value2
        End Function
    End Class

    Public Class Divide
        Private Shared s_value1 As Integer
        Private Shared s_value2 As Integer

        Public Sub New(ByVal v1 As Integer, ByVal v2 As Integer)

            s_value1 = v1
            s_value2 = v2
        End Sub
        Public Function GetValues() As Double
            Try
                Return s_value1 / s_value2
            Catch ex As Exception
                Throw ex
            End Try

        End Function
    End Class

End Namespace

现在将该库的引用放入您的 windows 表单项目

Imports calculation.calulation


Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Try
            Dim obj As Double = New Operations(2, 3).Multiply

            Dim obj2 As Double = New Operations(2, 3).Divide



            MsgBox(obj.ToString)
            MsgBox(obj2.ToString)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try




    End Sub