【问题标题】:is there a way to divide groups of fields into "sub structures" inside a class有没有办法将字段组划分为类内的“子结构”
【发布时间】:2017-01-23 23:12:14
【问题描述】:

我正在向我的项目管理软件中添加一个业务仪表板模块。
仪表板将不常被一小部分用户使用——因此我想避免使用静态/共享类或每次执行都会消耗硬件资源。

我希望所有仪表板颜色都将从 instance 类中的字段初始化:DashBoardGUI,这将是 Disposed/最后收集的垃圾。

这样做的目的是让程序员能够轻松更改共享颜色,并让用户自定义首选颜色并将它们保存在数据库中。

类非常基础,没有构造函数,没有大型或资源密集型对象,只有 Color 类型的字段。

问题是有很多字段 (~35) 所以我在开发 GUI 时很难识别所有字段。

我的意思是,如果我想从DashBoardGUI 实例中调用一个字段 它非常confisung,看起来像这样:

Public Class CreateGUI
Inherits System.Windows.Forms.Panel

    Private ColorKit As New DashBoardGUI

    Protected Overridable Sub Init()
        RightFlowLayOutPannel.BackColor = ColorKit.someConfusingFieldName1
        LeftFlowLayOutPannel.BackColor = ColorKit.someConfusingFieldName2
        RightClockGraph.BackColor = ColorKit.someConfusingFieldName3
        LeftGroupBox.ForeColor = ColorKit.someConfusingFieldName4
    End Sub
End Class

我的愿望是获得像使用命名空间“。”一样的效果。标志将减少选项并引导我到请求的字段:

Public Class CreateGUI
Inherits System.Windows.Forms.Panel

    Private ColorKit As New DashBoardGUI

    Protected Overridable Sub Init()
        RightFlowLayOutPannel.BackColor = ColorKit.FlPannels.FieldName
        LeftFlowLayOutPannel.BackColor = ColorKit.FlPannels.FieldName
        RightClockGraph.BackColor = ColorKit.Clocks.FieldName
        LeftGroupBox.ForeColor = ColorKit.GroupBoxes.FieldName
    End Sub
End Class

我尝试创建 nested Structuresnested Classes inside DashBoardGUI 类,但如果它们被声明为静态/共享,编译器不允许我使用它们。如果我声明它们是共享的,那也是不可能的:

shared is not valid on a structure deceleration(我明白为什么)。

所以我的问题是:我怎样才能获得类似于使用具有多个共享类的命名空间的效果 - 调用字段如:xxx.yyy.myfield 当我使用实例类时?
也许有人有完全不同的方法,可以给我建议吗?
也许我节省资源的方法(在顶部解释)是错误的,我应该使用静态/共享类创建命名空间?

谢谢。

【问题讨论】:

  • 你可以让 Flannels、Clocks、GroupBoxes 继承自 DashBoardGUI。并将其放入 ColorKit 命名空间。
  • 这不是一个坏主意,但我已经继承了 System.Windows.Forms.Panel - 我会将它添加到问题中的示例中
  • 嗯,你可以尝试做一个基于 Panel 的用户控件并添加你自己的 ColorKit 属性......我只是在大声思考
  • 这是一个创意,但也许有更简单的解决方案(?)
  • 没有办法做嵌套枚举......最好的“寻找”方式是嵌套类stackoverflow.com/a/5992839/439371我猜这很简单但无效

标签: c# vb.net winforms oop


【解决方案1】:

我没有读过这个问题,但可能是这样的:

Class A
    Class B
        Public myfield%
    End Class
    Public yyy As New B
End Class

示例使用:

Dim xxx As New A
xxx.yyy.myfield = 123

【讨论】:

  • 非常好!这就是答案!有趣的是,您需要以这种方式公开 B:Public yyy As New B
  • @jonathana 是Public yyy As B = New B 的缩写。也可以是Public yyy As B,然后是yyy = New B,再访问yyy
【解决方案2】:

您可以将所需的字段分组到类中,如下所示

Define String ENUM in VB.Net

例如

Class FlPanels

    Private Key As String

    Public Shared ReadOnly confusingField1 As FlPanels = New FlPanels("confusingField1")
    Public Shared ReadOnly confusingField2 As FlPanels = New FlPanels("confusingField2")

    Private Sub New(key As String)
        Me.Key = key
    End Sub

    Public Function FieldName() As String
        Return Me.Key
    End Function
End Class

并像这样使用它:

FlPanels.confusingField1.FieldName

【讨论】:

猜你喜欢
  • 2020-06-28
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2019-09-02
  • 2020-08-24
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多