0

我想在 python 中为一堆与此类似的子类声明类级变量:Python 中的静态类变量。我了解到shared属性可能是我想要使用的,但我不太确定在哪里使用它。

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

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

我的问题是我无法弄清楚需要共享什么才能正确执行此操作,或者我的代码需要如何组织才能实现这一点。我尝试共享最终允许我从子类获取属性的属性,而不仅仅是子类的实例,但是它不会返回我使用Sharedor在子类中分配的属性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并让它返回"Cat"。我知道这个例子对于类名是多余的,但对于其他属性却不是。

4

2 回答 2

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
于 2013-07-02T15:02:30.990 回答
1

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

现在代码适用于这两个更改,但有一个警告标志表明该属性应声明为“重载”,这实际上不是正确的解决方案。要正确摆脱警告,Shadows应该声明。该代码在没有声明阴影的情况下工作,因为阴影是子属性的默认行为,但为了摆脱 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,所以我决定避免父类行为的最佳方法是直接使用父类属性,因为它无论如何都没有保存任何重要信息。您可以尝试非常小心,不要在代码中通过父级调用子级,以避免父级行为。

于 2013-07-03T17:46:55.583 回答