VB.Net中的MyClass

时间:2008-10-01 01:42:09

标签: vb.net

VB.Net的MyClass关键字的实际用途是什么?

我理解technical usage of MyClass;我不明白它在现实世界中的实际用法。

如果您有任何虚拟(可覆盖)成员,则只有使用MyClass才有意义。但它也意味着您要忽略子类中重写的实现。这似乎是自相矛盾的。

我可以想到一些人为的例子,但它们只是糟糕的设计而不是实际用途。

4 个答案:

答案 0 :(得分:1)

多态性

对不起,我这里没有明确的代码示例,但您可以按照下面的链接进行操作,我讨厌复制MSDN Library的描述,但它非常好,以至于很难更清楚地重写它。 / p>

“MyClass提供了一种引用当前类实例成员的方法,而不会被任何派生类重写替换.MyClass关键字的行为类似于一个对象变量,它引用了最初实现的类的当前实例。”

另请注意,您不能在共享方法中使用MyClass。

通过MyClass实现多态性的一个很好的例子是http://www.devarticles.com/c/a/VB.Net/Implementing-Polymorphism-in-VB.Net/

答案 1 :(得分:1)

从编译器的角度来看,

MyClass是一种省略callvirt指令以支持call指令的方法。实质上,当您使用虚拟语义(callvirt)调用方法时,您表示要使用派生最多的变体。如果您希望省略派生的变体,请使用MyClasscall)。虽然您已经说过了解基本概念,但我认为从功能角度描述它可能会有所帮助,而不是隐含的理解。它在功能上与MyBase完全相同,其中范围的警告是MyBase的基本类型,而不是MyClass的活动类型。

在层次结构中的当前点覆盖虚拟调用语义通常是一个糟糕的设计选择,唯一有效的是当您必须依赖对象层次结构中的特定功能时,不能依赖继承者通过其实现中的基本调用来调用您的变体。它也可以依赖于你作为设计师决定它是唯一的选择,因为你在对象层次结构中进一步覆盖了功能,你必须确保在这个角落的情况下,这个特定的方法,在当前的继承级别树,必须叫。

全部是关于设计,了解整体设计和角落案例。可能原因是C♯不包含此类功能,因为在这些极端情况下,您可以将方法分离为层次结构中当前级别调用的私有变体,并在必要时引用该私有实现。我个人认为,利用分割方法是达到目的的理想手段,因为它明确了您的设计选择,并且更易于遵循(而且它也是唯一的有效的表示没有与MyClass等效的功能的语言。)

答案 2 :(得分:-1)

我想唯一可以看到它的用途的情况是,如果你想要基本条件和同时继承的条件? I.E.您希望能够继承成员的位置,但是您希望能够访问尚未通过继承更改的该成员的值吗?

答案 3 :(得分:-3)

如果你想调用一个链式构造函数,你需要它。

Public Sub New(ByVal accountKey As Integer)
    MyClass.New(accountKey, Nothing)
End Sub

Public Sub New(ByVal accountKey As Integer, ByVal accountName As String)
    MyClass.New(accountKey, accountName, Nothing)
End Sub

Public Sub New(ByVal accountKey As Integer, ByVal accountName As String, ByVal accountNumber As String)
    m_AccountKey = accountKey
    m_AccountName = accountName
    m_AccountNumber = accountNumber
End Sub