好像只能这样:
class Base
{
public virtual void F() {}
}
class B:Base
{
public void baseF()
{
base.F();
}
public override void F() {} // overrides Base.F
}
B b=new B();
b.baseF();
class Base
{
public virtual void F() {}
}
class B:Base
{
public void baseF()
{
base.F();
}
public override void F() {} // overrides Base.F
}
B b=new B();
b.baseF();
是使用 base.F()就可以了,就是重新调用 父类对应的方法 ,没有什么特别,不好处理带参数的调用, c# 在这个方面没有什么惊喜
按开门大哥(dy_2000_abc(芝麻开门))所说的方法也可行的,
我还以为C#也提供类拟C++派生类对象访问基类虚函数(object::baseClass.virtualFunc())的型式,因为像开门大可所说的方法还是挺麻烦的哦?!
Base b=new B();
b.F();
此时调用的是基类方法。
我的意思是说.class Child:BaseChild c=new Child();
Base b=c;无论用b,还是用c,都没有办法访问被Child重写的Base定义的虚拟方法。这个虚拟方法如上面所说,只能在继承者的方法内使用base来访问。下面是直接编译IL来访问基类的方法的例子:using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;namespace L
{
public class OK
{
virtual public void Write()
{
Console.WriteLine("OK::Write");
}
}
public class Child:OK
{
override public void Write()
{
Console.WriteLine("Child::Write");
}
}
public class L
{
static void Main()
{
AssemblyName asmName=new AssemblyName();
asmName.Name="DynAsm";
AssemblyBuilder asmb=Thread.GetDomain().DefineDynamicAssembly(asmName,AssemblyBuilderAccess.Run);
ModuleBuilder modb=asmb.DefineDynamicModule("DynMod");
TypeBuilder tb=modb.DefineType("DynType",TypeAttributes.Public);
MethodBuilder mb=tb.DefineMethod("M",MethodAttributes.Public|MethodAttributes.Static,typeof(void),new Type[]{typeof(OK)});
ILGenerator g=mb.GetILGenerator(); g.Emit(OpCodes.Ldarg_0);
g.Emit(OpCodes.Call,typeof(OK).GetMethod("Write")); g.Emit(OpCodes.Ldarg_0);
g.Emit(OpCodes.Call,typeof(Child).GetMethod("Write")); g.Emit(OpCodes.Ldarg_0);
g.Emit(OpCodes.Callvirt,typeof(OK).GetMethod("Write")); g.Emit(OpCodes.Ret); Child c=new Child();
OK o=c; c.Write();
o.Write(); Type t=tb.CreateType();
t.GetMethod("M").Invoke(null,new object[]{c});
}
}
}
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;namespace L
{
public class OK
{
virtual public void Write()
{
InternalWrite();
}
virtual protected void InternalWrite()
{
Console.WriteLine("OK::Write");
}
}
public class Child:OK
{
override public void Write()
{
base.Write();
}
override protected void InternalWrite()
{
Console.WriteLine("Child::Write");
}
}
public class L
{
static void Main()
{
AssemblyName asmName=new AssemblyName();
asmName.Name="DynAsm";
AssemblyBuilder asmb=Thread.GetDomain().DefineDynamicAssembly(asmName,AssemblyBuilderAccess.Run);
ModuleBuilder modb=asmb.DefineDynamicModule("DynMod");
TypeBuilder tb=modb.DefineType("DynType",TypeAttributes.Public);
MethodBuilder mb=tb.DefineMethod("M",MethodAttributes.Public|MethodAttributes.Static,typeof(void),new Type[]{typeof(OK)});
ILGenerator g=mb.GetILGenerator(); g.Emit(OpCodes.Ldarg_0);
g.Emit(OpCodes.Call,typeof(OK).GetMethod("Write")); g.Emit(OpCodes.Ldarg_0);
g.Emit(OpCodes.Call,typeof(Child).GetMethod("Write")); g.Emit(OpCodes.Ldarg_0);
g.Emit(OpCodes.Callvirt,typeof(OK).GetMethod("Write")); g.Emit(OpCodes.Ret); Child c=new Child();
OK o=c; c.Write();
o.Write(); Type t=tb.CreateType();
t.GetMethod("M").Invoke(null,new object[]{c});
}
}
}