加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

vb.net – 声明共享MustOverride

发布时间:2020-12-17 00:12:24 所属栏目:大数据 来源:网络整理
导读:那么为什么不允许共享MustOverride / Overridable成员呢?有些人认为覆盖与继承有关,这在共享成员的情况下没有意义,因为没有涉及实例化.这是我需要它的一个例子: 我的基类DrawingObject定义了一个名为TypeName的共享成员,该成员必须由每个子类实现,以返回唯
那么为什么不允许共享MustOverride / Overridable成员呢?有些人认为覆盖与继承有关,这在共享成员的情况下没有意义,因为没有涉及实例化.这是我需要它的一个例子:

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

基类

Public MustInherit Class DrawingObject
    Public MustOverride ReadOnly Property TypeName As String
End Class

儿童班

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

此代码工作正常,但理想情况下TypeName应该已共享,因为它返回Const.

重写的重点是促进多态性.传递一个对象,它的行为方式取决于对象的类型而不是引用的类型.如果你正在调用共享成员,那么你在一个类型而不是一个对象上调用它们,所以多态性不适用,所以覆盖提供没有优势.

在您的情况下,如果您想要获取对象的TypeName而不知道该对象在运行时的类型,那么覆盖该属性将是有意义的.无论您身在何处,都可以获得该属性,并获得该对象类型的名称.使用Shared成员,您将获得特定类型的属性,这样您就可以获得该类型的属性.

请求的例子:

假设你的形状知道如何在屏幕上绘制自己.您可以从具有基本Shape类和Draw方法的基础Shape类开始,然后在例如Square和Circle类中继承该类.然后你可以有这样的方法:

Public Sub DrawShape(myShape As Shape)
    myShape.Draw()
End Sub

在这种情况下,在派生类中重写Draw方法是有意义的,因为这样做只允许您在有Shape引用的地方调用Draw,并知道它将被正确绘制.如果该方法通过Square,那么将绘制一个正方形,如果它被传递给Circle,那么将绘制一个圆,但由于多态性,该方法不必知道或关心.

如果你的建议是可能的,并且Draw是一个共享方法,那么每次你想绘制一个正方形和Circle.Draw时你都必须调用Square.Draw.覆盖的全部意义在于,您应该能够在基类型的引用上调用该方法,并获得在派生类型中定义的功能.在您的场景中,您必须在派生类型上调用方法以获取派生类型中定义的功能,因此您没有任何优势.你不能只调用Shape.Draw并发生任何有用的事情.除了其他任何东西,它会选择哪个派生类?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读