- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对面向对象编程很陌生,并试图让我的风格正确。
我经常有一个对象,其属性是包含其他对象的字典。将其命名为“Team”类,其中包含“Player”类。
现在假设每次将玩家添加到团队时,我都希望更新团队的平均年龄。
我最喜欢的解决方案:
在Sub Main
中我应该说
Team.add(Player)
然后在Team
中,方法add
是:
Public Sub Add(Player As CPlayer):
pPlayers.Add Player.Name, Player
Me.UpDateAvgAge(Player.Age)
End Sub
现在我可以想象至少一种替代方法:
在主
中:
Team.add(Player)
Team.UpDateAvgAge(Player.Age)
并且 add
方法当然不应该有 Me.UpDateAvgAge(Player.Age)
行。
不用说,这只是最简单的例子。在现实生活中,每次我“添加”某些内容时,都会“更新”许多属性。
程序员对于如何进行此添加/更新是否达成共识?有什么指导方针吗?
提前谢谢!
最佳答案
我可以想象这样的事情。当新玩家添加到集合中时,CTeam 类会立即预先计算团队成员的年龄总和。然后只需使用这个数字,而不必循环遍历所有项目并计算数字。但是,您必须更新该值,以防成员从集合中删除等。您必须决定这项工作是否合适,或者您是否只是在需要时计算所有值(意味着没有缓存)。
您还可以向 CTeam 类添加事件,以便让订阅者知道新的团队成员已添加到集合中。就像这个例子中的那样,UserForm1 是订阅者,当 CTeam 类的发布者创建新玩家时,它会收到通知。 HTH
' CTeam 类:
Public Event PlayerWasAdded(player As CPlayer)
Private m_players As VBA.Collection
Private m_sumTeamAge As Single
Private Sub Class_Initialize()
Set m_players = New VBA.Collection
End Sub
Public Sub Add(player As CPlayer)
m_players.Add player, player.Name
m_sumTeamAge = m_sumTeamAge + player.Age
RaiseEvent PlayerWasAdded(player)
End Sub
Public Property Get AverageAge() As Single
If m_players.Count > 0 Then
AverageAge = m_sumTeamAge / m_players.Count
Else
AverageAge = 0
End If
End Property
'UserForm1 类:
Private WithEvents m_team As CTeam
Private Sub UserForm_Initialize()
Dim i As Integer
Set m_team = New CTeam
For i = 1 To 5
m_team.Add CreateNewPlayer(i)
Next
End Sub
Private Sub m_team_PlayerWasAdded(player As CPlayer)
MsgBox "New player " & player.Name & " was added. Do something ...", vbInformation
End Sub
Private Sub ShowAverageAge_Click()
MsgBox "Average age of team member is: " & m_team.AverageAge, vbInformation
End Sub
Private Sub AddNewPlayer_Click()
m_team.Add CreateNewPlayer(...)
End Sub
Private Function CreateNewPlayer(platerIndex As Integer) As CPlayer
Dim upperbound As Integer: upperbound = 35
Dim lowerbound As Integer: lowerbound = 18
Dim player As CPlayer
Set player = New CPlayer
player.Name = "Player_" & platerIndex
player.Age = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
Set CreateNewPlayer = player
End Function
关于vba - 面向对象风格 - 在哪里定义属性?编程语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22780480/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!