在不明确了解它们的情况下列出子类

时间:2014-09-17 05:16:29

标签: vb.net oop inheritance

假设我有一个VanillaIceCream和StrawberryIceCream继承的抽象类IceCream。我还有一个IceCreamView,它可以引用抽象类IceCream(即只使用所有类型的冰淇淋的常见属性)。但是,我还需要在视图中实现一个组合框,用户可以在其中选择他们想要创建的IceCream类型;可用类型应由IceCream的子类确定。

我的问题是:有没有什么方法可以在这个视图中列出IceCream的所有子类而不在抽象超类和视图中明确地知道它们?

我的问题的背景是我希望能够在未改变现有代码的情况下扩展未来的功能(添加更多类型的冰淇淋)。

我提出的唯一解决方案就是: 1)在View中手动输入子类的名称。 2)引用子类而不是(/除此之外)View中的抽象超类。 3)在超类中创建一个列出所有子类的枚举。

2 个答案:

答案 0 :(得分:0)

这取决于你正在编写的语言。有些语言可以在运行时轻松检查,有些语言可以让每个具体的类自我注册变得容易,有些语言具有完全新颖的功能。所以你写的是什么,比某些具有继承性的语言更具体,可能使用" super / sub class"的命名法?

答案 1 :(得分:0)

您需要使用Reflection。使用以下方法:

''' <summary>
''' Retrieves all subclasses of the specified type.
''' </summary>
''' <param name="baseType">The base type.</param>
''' <param name="onlyDirectSubclasses">Indicates whether only the direct subclasses
''' should be retrieved. If set to <see langword="false"/>, then all, also
''' indirect subclasses will be retrieved.</param>
''' <returns></returns>
''' <remarks></remarks>
Function GetSubclasses(ByVal baseType As Type, ByVal onlyDirectSubclasses As Boolean) As List(Of Type)
    Dim res As New List(Of Type)

    For Each asm As Reflection.Assembly In AppDomain.CurrentDomain.GetAssemblies()
        For Each typ As Type In asm.GetTypes()
            If onlyDirectSubclasses Then
                If typ.BaseType Is baseType Then
                    res.Add(typ)
                End If
            Else
                If typ.IsSubclassOf(baseType) Then
                    res.Add(typ)
                End If
            End If
        Next
    Next

    Return res
End Function

然后叫它:

Dim subclasses As List(Of Type) = GetSubclasses(GetType(IceCream), False)