vb.net – 声明共享MustOverride
那么为什么不允许共享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并发生任何有用的事情.除了其他任何东西,它会选择哪个派生类? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |