在子类中声明类级别变量

时间:2013-07-02 14:34:05

标签: vb.net class shared

我想在python:Static class variables in Python中为一堆类似于此类的子类声明类级别变量。我已经知道shared归因于我想要使用的东西,但我不太确定在哪里使用它。

这是我的情况:我为游戏制作了一堆不同的角色类型(100+)。所有字符类型都具有相同的属性集,因此我创建了一个包含所有属性和所需内部变量的基类。每种字符类型都有一组不可变属性,对于给定字符类型的每个实例都是完全相同的,但在字符类型之间有所不同。我想在子类中包含不可变字符类型属性作为类“变量”(每个字符类型一个子类),就像上面python示例的答案一样。

关键是我想引用一些属性而不必创建子类的实例。

我的问题是我无法弄清楚需要分享哪些才能正确地执行此操作或我的代码需要如何组织以实现此目的。我尝试共享属性,最终允许我从子类中获取属性而不仅仅是子类的实例,但是它不会使用Shared或{返回我在子类中指定的属性{1}}。我想将属性保留在基类中,这样我就不必为每个子类复制和粘贴相同的属性。

以下是我的代码的一些示例:

Shared Shadows

目标是能够输入Public MustInherit Class Char 'IMMUTABLE INFORMATION ' CharType Traits Shared _ID As Integer Shared _Species As String Public Shared ReadOnly Property Species As String Get Return _Species End Get End Property End Class Public Class CharCat Inherits Char Shared Shadows _Species = "Cat" End Class 并让它返回CharCat.Species。我知道这个例子对于类名是多余的,但是对于其他属性它不是。

2 个答案:

答案 0 :(得分:3)

您可以使BaseClass Species属性Overridable实现您正在寻找的目标。

Public MustInherit Class [Char]

    Private _ID As Integer
    Private _Species As String

    Public Overridable ReadOnly Property Species As String
        Get
            Return _Species
        End Get
    End Property

End Class

Public Class CharCat
    Inherits Char

    Public OverLoads Shared ReadOnly Property Species As String
        Get
            Return "Cat"
        End Get
    End Property

End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    MsgBox(CharCat.Species)

End Sub

答案 1 :(得分:1)

使用NoAlias的回应作为弹簧板与更多的研究和SO问题合作,我找到了一个完整的答案。考虑到基类不需要Overridable,因为子类使用Shared,所以它不能具有Overrides属性。据报道Overloads根据Hans Passant对财产没有任何作用,所以我们也不需要这样做。

现在代码可以使用这两个更改,但是有一个警告标志,表示该属性应该声明为“Overloads”,这实际上并不是正确的解决方案。要正确删除警告,应声明Shadows。代码工作时没有声明阴影,因为Shadowing is the default behavior for a child property,但是为了摆脱VB抛出的警告,你需要明确地声明它。

代码最终看起来像这样:

Public MustInherit Class [Char]

    Private _ID As Integer
    Private _Species As String

    Public ReadOnly Property Species As String
        Get
            Return _Species
        End Get
    End Property

End Class

Public Class CharCat
    Inherits Char

    Public Shared Shadows ReadOnly Property Species As String
        Get
            Return "Cat"
        End Get
    End Property

End Class

Private Sub Form1_Load(ByVal sender As System.Object, _ 
    ByVal e As System.EventArgs) Handles MyBase.Load

    MsgBox(CharCat.Species)

End Sub

重要的是要注意我们现在必须处理Shadows行为。如果通过父类调用子类,则将获得该属性的父类行为。对我来说,因为我无法使用Overrides,因为我正在使用Shared,所以我认为避免父类行为的最佳方法就是获取父类属性,因为它不是'无论如何都要持有任何重要信息。您可以尝试过分小心,不要通过代码中的父级调用子级来避免父级行为。