在下面的代码中,我尝试了两种方法来访问methodTwo的父版本,但结果始终为2。是否有任何方法可以在不修改这两个类的情况下从ChildClass实例获取1结果?
class ParentClass { public int methodOne() { return methodTwo(); } virtual public int methodTwo() { return 1; } } class ChildClass : ParentClass { override public int methodTwo() { return 2; } } class Program { static void Main(string[] args) { var a = new ChildClass(); Console.WriteLine("a.methodOne(): " + a.methodOne()); Console.WriteLine("a.methodTwo(): " + a.methodTwo()); Console.WriteLine("((ParentClass)a).methodTwo(): " + ((ParentClass)a).methodTwo()); Console.ReadLine(); } }
更新 ChrisW发布:
从课堂之外,我不知道有什么简单的方法。但是,也许,我不知道如果尝试反射会发生什么:使用Type.GetMethod方法在ParentClass中找到与该方法关联的MethodInfo,然后调用MethodInfo.Invoke
该答案已删除。我想知道这种破解是否可以工作,只是出于好奇。
在IL级别,您可以发出a call而不是a callvirt来完成工作-但是,如果我们将自己限制为C#;-p( 编辑 darn!运行时将停止您VerificationException::“操作可能会使运行时不稳定。”;删除的virtual,它工作正常;太聪明了一半…)
call
callvirt
VerificationException
virtual
在ChildClass类型内部,您可以使用base.methodTwo()-但是,这在外部是不可能的。您也不能下降超过一个级别- 没有base.base.Foo()支持。
ChildClass
base.methodTwo()
base.base.Foo()
但是,如果使用方法隐藏禁用多态,则可以得到所需的 答案 ,但原因很糟糕:
class ChildClass : ParentClass { new public int methodTwo() // bad, do not do { return 2; } }
现在,根据变量定义为a ChildClass还是a,您可以从同一对象获得不同的答案ParentClass。
ParentClass