声明共享MustOverride

dot*_*NET 6 vb.net oop overriding shared

那么为什么不允许Shared MustOverride/ Overridable成员呢?有些人认为覆盖与继承有关,这对Shared成员来说没有意义,因为没有涉及实例化.这是我需要它的一个例子:

我的基类DrawingObject定义了一个Shared名为TypeName必须由每个子类实现的成员,以返回唯一的标识字符串,该标识字符串对于每种子类型都不同,但对于一种子类型的所有实例都是相同的.现在这要求我将TypeName属性定义为SharedOverridable.或者有更好的方法吗?

基类

Public MustInherit Class DrawingObject
    Public MustOverride ReadOnly Property TypeName As String
End Class
Run Code Online (Sandbox Code Playgroud)

儿童班

Public Class Rectangle
    Inherits DrawingObject

  Public Overrides ReadOnly Property TypeName As String
    Get
      Return A_CONST_STRING_DEFINED_IN_THIS_CLASS
    End Get
  End Property
End Class
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,但理想情况TypeName应该是Shared因为它返回了一个Const.

jmc*_*ney 5

覆盖的全部目的是促进多态性。您传递一个对象,它的行为方式取决于对象的类型而不是引用的类型。如果您调用Shared成员,那么您是在类型而不是对象上调用它们,因此多态性不适用,因此覆盖没有任何优势。

在您的情况下,如果您想获取TypeName对象的 ,而不知道该对象在运行时是什么类型,那么覆盖该属性是有意义的。无论您身在何处,都可以获得该属性,并且可以获得该对象的类型名称。对于共享成员,您将获取特定类型的属性,因此您可以简单地获取该类型的属性。

请求的示例:

假设您有一个知道如何在屏幕上绘制自己的形状。您可以从带有方法的基类Shape的基类开始,然后在例如和类中继承该类。然后你可以有这样的方法:ShapeDrawSquareCircle

Public Sub DrawShape(myShape As Shape)
    myShape.Draw()
End Sub
Run Code Online (Sandbox Code Playgroud)

Draw在这种情况下,重写派生类中的方法是有意义的,因为这样做可以让您简单地调用Draw任何有Shape引用的地方,并知道它将被正确绘制。如果该方法传递 a ,Square则将绘制一个正方形,如果传递 a ,Circle则将绘制一个圆形,但由于多态性,该方法不必知道或关心。

如果您的建议是可能的,并且Draw是一种方法,那么您每次想绘制正方形和每次想绘制圆形时都Shared必须调用。重写的重点是您应该能够在基类型的引用上调用该方法并获取派生类型中定义的功能。在您的场景中,您必须调用派生类型上的方法才能获取派生类型中定义的功能,因此您没有任何优势。你不能只是打电话就让任何有用的事情发生。除此之外,它会选择哪个派生类?Square.DrawCircle.DrawShape.Draw

  • 感谢您的解释,但您只是在这里描述对象多态性。我的实际问题仍然没有解决。强制派生类公开共享成员的正确方法是什么?我们可以对非共享成员使用“MustOverride”来做到这一点,但对于共享成员似乎没有任何这样的方法。这里的问题陈述很简单:如果子类是“DrawingObject”,它确实有一个“TypeName”,顺便说一句,它对于所有子类对象都是通用的(因此是“Shared”)。现在基类应该有一种方法将其强加给其子类。 (2认同)