码迷,mamicode.com
首页 > Windows程序 > 详细

xlua怎么样hotfix C#中的重写方法???

时间:2018-12-11 12:47:28      阅读:560      评论:0      收藏:0      [点我收藏+]

标签:继承   system   错误   base   设计   比较   --   inpu   来源   

问题的来源之这样的:

线上项目遇到一个问题,就是子类 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 关键字的直接使用,可以通过另外的手段去替代,就比如上的方式,在父类中定义一个父对象字段。

以上仅是由于个人知识有限,才想出的解决方式。

xlua怎么样hotfix C#中的重写方法???

标签:继承   system   错误   base   设计   比较   --   inpu   来源   

原文地址:https://www.cnblogs.com/luguoshuai/p/10101265.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!