如何解决与类共享值并通过属性返回值
我认为我无法很好地解释自己,如果这没有意义,请见谅。
下面的例子有两个函数可以做一些工作正常的计算:
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
我想做的是类似于下面的事情(这行不通,但希望这能说明我正在尝试做的事情)。我想与一个类共享参数,然后选择一个返回值的属性,例如类似于 DataGridView1.Item(1,1).Size
。有点像属性中的属性,但我搜索了它并没有返回任何好的结果。
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
实例来使用它,而任何其他创建不同实例的代码都不会对此产生影响。在第二种情况下,因为类只有一组属性,您可以将它们设置在一个位置,然后在第二个位置将它们设置为其他内容,然后首先调用一个方法并期望结果为使用第一组属性值。只有一组字段,这些方法将始终使用分配给它们的最后一个值,无论发生在代码的哪个位置。
还值得注意的是,如果您想定义一个包含所有 Shared
成员的类,您可能应该改为定义一个模块。模块在幕后编译为类,它们本质上会阻止您创建实例,因此模块成员的行为类似于 Shared
类成员。不同之处在于您不必使用模块名称来限定模块成员,而您必须限定 Shared
类成员。有些人不喜欢这样,并错误地认为它违反了 OOP 的规则。如果您愿意,您仍然可以限定模块成员,但课程强迫您这样做。
如果您想要单行,那么您可以同时使用实例成员和 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()
,
如有遗漏请更正,我在这里创建类库
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。