在C#重写方法中能否使用base.base直接调用顶级基类方法?
如何在子类中跳过中间父类直接调用基类方法?
你希望在B类的重写方法里执行专属逻辑后,跳过A类的相关逻辑,直接调用BaseClass中的createArrays方法,但C#并不支持base.base这种语法。以下是几种可行的实现思路:
方案1:拆分基类核心逻辑为非虚方法
把BaseClass中createArrays的实际工作代码抽成一个独立的非虚protected方法,这样子类可以直接调用这个核心方法,绕过中间父类的重写逻辑:
public class BaseClass { protected virtual void createArrays(int vertexCount) { CreateArraysCore(vertexCount); } // 提取核心逻辑为非虚方法,供子类直接调用 protected void CreateArraysCore(int vertexCount) { // do the actual work } } public class A : BaseClass { protected override void createArrays(int vertexCount) { // Do something specific to A base.createArrays(vertexCount); } } public class B : A { protected override void createArrays(int vertexCount) { //Do something specific to B, but not to A CreateArraysCore(vertexCount); // 直接调用BaseClass的核心逻辑 } }
方案2:通过反射调用基类方法
利用反射直接获取并调用BaseClass中的createArrays方法,这种方式属于hack手段,会失去编译时检查且有性能损耗,但能实现需求:
public class B : A { protected override void createArrays(int vertexCount) { //Do something specific to B, but not to A var baseMethod = typeof(BaseClass).GetMethod( "createArrays", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic ); baseMethod?.Invoke(this, new object[] { vertexCount }); } }
方案3:修改中间父类A提供可控入口
如果允许修改A类,可以新增一个重载方法,让子类能选择是否执行A类的专属逻辑:
public class A : BaseClass { protected override void createArrays(int vertexCount) { createArrays(vertexCount, true); } // 新增重载方法,通过参数控制是否执行A类逻辑 protected void createArrays(int vertexCount, bool runASpecificLogic) { if (runASpecificLogic) { // Do something specific to A } base.createArrays(vertexCount); } } public class B : A { protected override void createArrays(int vertexCount) { //Do something specific to B, but not to A createArrays(vertexCount, false); // 传入false跳过A类逻辑 } }
内容的提问来源于stack exchange,提问作者Frederik Steinmetz
相关产品推荐
相关产品推荐

