问题的来源之这样的:
线上项目遇到一个问题,就是子类 override 了父类的一个 virtual 方法,并且调用到了父类里面的 virtual 方法。现在子类 override 的方法里有一些错误逻辑,希望通过 xlua 去修复。类似如下的代码:
1 using System; 2 using UnityEngine; 3 4 namespace LGSTEST 5 { 6 public class LgsParent : MonoBehaviour 7 { 8 public virtual void ShowName() 9 { 10 Debug.Log("parent function!"); 11 } 12 } 13 14 public class Lgs : LgsParent 15 { 16 void Update() 17 { 18 if (Input.GetMouseButtonDown(0)) 19 { 20 ShowName(); 21 } 22 } 23 24 public override void ShowName() 25 { 26 base.ShowName(); 27 28 Debug.Log("child function!"); 29 30 #region 错误的逻辑 31 32 #endregion 33 } 34 } 35 }
现在遇到的问题是,在 xlua 中,怎样写第26行的逻辑???当然了,如果这个继承关系只是普通的父类到子类的一对一的对应关系,可以用 xlua 对父类中的方法重新写一遍。但是,如果父类是一个类似项目里面的 UI 基类这样的父类,父类中的 virtual 方法可能随时会改动,这样的话,不可能说每次改动父类的时候,都用 xlua 对父类里的逻辑写一遍。
由于我没有想到通过什么样的方法,在 xlua 中去写第 26 行的逻辑,所以个人建议,在前期设计C#中的基类的时候就考虑的这个问题。什么意思,现在对以上的代码做如下调整:
1 using System; 2 using UnityEngine; 3 4 namespace LGSTEST 5 { 6 public class LgsParent : MonoBehaviour 7 { 8 public LgsParent parent = null; 9 10 public void InitParent() 11 { 12 if (null == parent) 13 parent = new LgsParent(); 14 } 15 16 public virtual void ShowName() 17 { 18 Debug.Log("parent function!"); 19 } 20 } 21 22 public class Lgs : LgsParent 23 { 24 void Start() 25 { 26 InitParent(); 27 } 28 29 void Update() 30 { 31 if (Input.GetMouseButtonDown(0)) 32 { 33 ShowName(); 34 } 35 } 36 37 public override void ShowName() 38 { 39 if (null != parent) 40 parent.ShowName(); 41 42 Debug.Log("child function!"); 43 44 #region 错误的逻辑 45 46 #endregion 47 } 48 } 49 }
这样的话,在 xlua 中对子类 override 方法中的错误逻辑就很好修改了,如下:
1 xlua.hotfix(CS.LGSTEST.Lgs, "ShowName", function(self) 2 self.parent:ShowName(); 3 4 --[[ 5 修复后的逻辑放到这里 6 --]] 7 8 end)
运行结果:
所以,个人建议,如果项目打算用C#开,后期通过xLua修复问题的时候,对改动比较频繁的类的继承关系,尽量避免 base 关键字的直接使用,可以通过另外的手段去替代,就比如上的方式,在父类中定义一个父对象字段。
以上仅是由于个人知识有限,才想出的解决方式。
原文地址:https://www.cnblogs.com/luguoshuai/p/10101265.html
时间: 2024-10-10 21:30:00