在查看this question时,评论者@Jon Egerton提到MyClass
是VB.Net
中的关键字。从未使用过它,我去找了documentation就可以了:
MyClass关键字的行为类似于一个对象变量,它引用了最初实现的类的当前实例。 MyClass与Me类似,但是对它的所有方法调用都被视为方法是NotOverridable。
在某些特定情况下,我可以看到它有多么有用。我无法想到的是,你将如何在C#中获得相同的行为 - 也就是说,确保在当前类中实际调用对myMethod
的虚拟方法myMethod
,而不是派生的myMethod
(也就是在IL中,调用call
而不是callvirt
)?
我可能只是有一个完整的心理空白时刻。
答案 0 :(得分:14)
According to Jon Skeet,没有这样的等价物:
不,C#没有相当于VB.NET的MyClass关键字。如果您想保证不调用方法的重写版本,则需要首先将其设置为非虚拟。
一个明显的解决方法是:
public virtual void MyMethod()
{
MyLocalMethod();
}
private void MyLocalMethod()
{
...
}
然后,当VB用户写MyLocalMethod()
时,你可以调用MyClass.MyMethod()
。
答案 1 :(得分:3)
VB.Net中没有MyClass关键字的C#等价物。为了保证不会调用方法的重写版本,只需将其设置为非虚拟。
答案 2 :(得分:1)
除了答案说它不存在之外,所以你必须把它变成非虚拟的。
这是一个smelly(读:不要这样做!)解决方法。但严肃地说,重新考虑你的设计。
基本上将任何必须将基本调用的方法移动到“超级”基类中,该类位于现有基类之上。在你现有的类中调用base.Method()来始终调用非重写的。
void Main()
{
DerivedClass Instance = new DerivedClass();
Instance.MethodCaller();
}
class InternalBaseClass
{
public InternalBaseClass()
{
}
public virtual void Method()
{
Console.WriteLine("BASE METHOD");
}
}
class BaseClass : InternalBaseClass
{
public BaseClass()
{
}
public void MethodCaller()
{
base.Method();
}
}
class DerivedClass : BaseClass
{
public DerivedClass()
{
}
public override void Method()
{
Console.WriteLine("DERIVED METHOD");
}
}