如何将“子属性”添加到类属性

时间:2013-09-16 18:58:27

标签: vb.net class properties

如果在代码中我想做类似下面的事情,我的类定义需要看起来像什么? (请记住,水果/语言只是一个例子

dim myfruit as new fruit()
myfruit.name = "apple"
myfruit.name.spanish = "manzana"

这是我的课程,只是不知道如何添加“子属性”。

Public Class Fruit
    Private _name As String
    Public Property name() As String
        Get
            Return _name 
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property
End Class

2 个答案:

答案 0 :(得分:4)

一般而言,要获得“子属性”,您需要将属性设为。这意味着子属性实际上是顶级属性公开的类的属性。

实际上,您将name属性从字符串更改为“Translations”类或类似,即:

Public Class Fruit
    Public Property Name As New Translations
End Class

Public Class Translations
    Public Property Primary As String
    public Property Spanish As String
End Class

但是,这可能会破坏您显示的代码,因为第二行需要使用不同的语法,即:

myfruit.Name.Primary = "green"
myfruit.Name.Spanish = "verde"

但是,如果此处的目标是仅处理用户界面的翻译,则还有其他选项。有关详细信息,请参阅MSDN上的Introduction to International Applications Based on the .NET Framework

答案 1 :(得分:0)

我最初认为里德的回答是我追求的。在我的应用程序中,我想使用“子属性”在表单标签上设置属性。 (我试图仅发出自定义控件可用的Label属性。)

我试过了:

Public Class Fruit
    Private _name As New Translations
    Public Property Name As Translations
        Get
            Return _name
        End Get
        Set(value As Translations)
            _name = value
            _PrimaryCaps = _name.Primary.ToUpper
        End Set
    End Property
    'Private variable is automatically added for unexpanded property
    Public Property PrimaryCaps As String
End Class

Public Class Translations
    Public Property Primary As String
    Public Property Spanish As String
End Class

然后

Dim myFruit As New Fruit
myFruit.Name.Primary = "Apple"
myFruit.Name.Spanish = "Manzana"
Dim primaryCaps As String = myFruit.PrimaryCaps

奇怪 - 至少对我来说 - 这不起作用; myFruit.PrimaryCaps没有返回任何东西,而不是希望的“苹果”。似乎永远不会执行Set for Name。 (然而,将_PrimaryCaps分配放在Get Return上方确实有效。)

(我意识到可以将一个PrimaryCaps属性添加到Translations类中,但是,如果你想在Fruit的一个实例中设置一个外部变量,这也无济于事。)

我不知道这是“按设计”,我是否只是误解了预期的功能或者是什么。经过进一步研究后,我做了一件事就是这种结构在.NET中根本不常见;例如,设置控件的大小如下:

oControl.Size = New Drawing.Size(20, 15)

而不是简单地直接设置Width属性:

oControl.Size.Width = 20

(后者不会编译:“表达式是一个值,因此不能作为赋值的目标。”)

如果有人对此有任何了解,我很乐意听到。我知道这可以简单地通过使用Fruit的一个实例来完成,但这不是重点。