题
我有两类:
public class MyBase
{
public virtual void DoMe()
{
}
}
public class MyDerived:MyBase
{
public override void DoMe()
{
throw new NotImplementedException();
}
}
和我有以下代码化MyDerived:
MyDerived myDerived=new MyDerived();
事情是怎么叫的圆顶的基类?如果我使用myDerived.圆顶(),然后得出的方法将被称为,导致一个例外。我试着投myDerived到许的,但它仍然是派生版本的方法,该方法被称为。
编辑:正如在下面的评论,我不能改变eitehr MyDerived或许因为他们不是我的代码。
解决方案
有一个解决方案,但它丑:使用反射获得基类方法,然后这些IL必要的称呼它。检查了 这篇文章 它说明如何做到这一点。我已经成功地使用这一方法,呼叫基类的执行方法的时候我已经是一个参考源类替代方法。
其他提示
你不能调用基级版本。
如果方法不起作用的源类,那么它就不太可能的基础版本的方法,将工作时呼吁一个实例得出类。这只是自寻烦恼。类的设计不是工作方式,并什么你想做将可能只是导致其他部分一流的不可预知的行为。
为什么你要叫这个方法上的对象对象时告诉你彻底,它不会的工作?
在我看来,这些课程有一些设计上的缺陷,并且如果你不允许更改类别,也许你可以改变一个更好的设计图书馆,而不是。
叫许.圆顶()从外部流的你会需要一个实例许或衍生的实例,这并不复盖顶().一种宣布作为一个虚拟将被称为在实际运行时型的对象,而不是类型的对象,这就是为什么铸造许不会改变什么方法。然而,如果方法不是宣布在许作为虚拟和MyDerived仍然实施的圆顶()将"藏匿"的许的执行情况。因此,如果提MyDerived它会叫MyDerived.圆顶(),但在这种情况下铸造许许=(许)myDerived然后叫许.圆顶()会打电话许.圆顶().
衍生类并不需要提供一种实现方法。删除它,并执行在基类将称为默认。
如果不同于你的例子,该方法的基类是抽象的,并且必须提供一个执行情况,但它没有道理的衍生类提供一个然后有可能是错误的东西设计的课程。
public class MyDerived:MyBase{
public override void DoMe()
{
base.DoMe();
}
}
编辑:
你不能访问基类方法从"之外",而无需通过类方法。你唯一的选择是实例基类直接并呼吁它的方法。
MyBase mb = new MyBase();
mb.DoMe();
给你的限制,另一种可能性存在:
下载。净反射器。现有的反编译代码然后作出的任何更改都需要支持的情况。
当然,审查的合法性这一前仍在继续。
这个问题是很老,但是我看不到以下选择:
你可以使用"新"的关键词以指定重叠的方法。然后你就会简单地转换为的类,其方法你想要呼叫。
public class MyBase
{
public virtual void DoMe()
{
}
}
public class MyDerived:MyBase
{
//note the use of 'new' and not 'override'
public new void DoMe()
{
throw new NotImplementedException();
}
}
执行情况
var myDerived = new MyDerived();
var derivedDoMe = myDerived.DoMe();
var baseDoMe = ((MyBase)myDerived).DoMe();