如何从两层或多层派生类中调用被重写的基类方法?
问题:多层派生类中调用被重写的上层基类方法
我希望从2层或3层派生类中调用被重写的基类函数,示例代码如下:
public class Level1 { public virtual void Encrypt(byte[] plain) { Console.WriteLine("level1"); } } public class Level2: Level1 { public override void Encrypt(byte[] plain) { Console.WriteLine("level2"); Console.WriteLine("Calling base class"); base.Encrypt(plain); } } public class Level3: Level2 { public override void Encrypt(byte[] plain) { Console.WriteLine("Level3"); // 调用Level2的Encrypt base.Encrypt(plain); // 如何调用Level1的Encrypt? base.base.Encrypt(plain); } }
以下写法会出现语法错误:
base.base.Encrypt(plain) CryptECB.Encrypt(plain)
请问如何从两层或多层派生类中调用被重写的函数?目前我通过在Level2中定义L1Encrypt并在Level3中调用作为临时解决方案,但这种方式较为繁琐,因为可能需要针对不同层级的多个函数做类似处理。
可行解决方案
方法1:显式转换为上层基类调用
将当前实例强制转换为目标基类(比如Level1),直接调用其方法,这样会绕过中间派生类的重写逻辑:
public class Level3: Level2 { public override void Encrypt(byte[] plain) { Console.WriteLine("Level3"); base.Encrypt(plain); // 调用Level1的Encrypt实现 ((Level1)this).Encrypt(plain); } }
这种方式简单直接,无需修改中间类的代码,适合只需要偶尔跨层级调用的场景。
方法2:在中间基类封装转发方法
如果需要频繁跨层级调用,可以在中间派生类(比如Level2)中封装专门的方法,用来调用上层基类的实现,供下层类复用:
public class Level2: Level1 { public override void Encrypt(byte[] plain) { Console.WriteLine("level2"); Console.WriteLine("Calling base class"); base.Encrypt(plain); } // 封装调用Level1的Encrypt方法,保护级别限制仅派生类可访问 protected void InvokeLevel1Encrypt(byte[] plain) { base.Encrypt(plain); } } public class Level3: Level2 { public override void Encrypt(byte[] plain) { Console.WriteLine("Level3"); base.Encrypt(plain); // 直接调用封装好的方法 InvokeLevel1Encrypt(plain); } }
这种方式比临时方案更具可维护性,多个方法可以批量封装,避免重复逻辑。
方法3:反射调用(不推荐)
如果前两种方法都无法满足需求,可以通过反射直接调用目标基类的方法,但反射会带来性能损耗,且代码可读性差,仅作为极端场景的备选:
public class Level3: Level2 { public override void Encrypt(byte[] plain) { Console.WriteLine("Level3"); base.Encrypt(plain); // 反射获取Level1的Encrypt方法并调用 var encryptMethod = typeof(Level1).GetMethod( "Encrypt", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance ); encryptMethod?.Invoke(this, new object[] { plain }); } }
内容的提问来源于stack exchange,提问作者cup
相关产品推荐
相关产品推荐

