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

问题的来源之这样的:

线上项目遇到一个问题,就是子类 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

xlua怎么样hotfix C#中的重写方法???的相关文章

c#中的重写方法与隐藏方

1.父类中有方法a,添加virtua修饰符可声明为虚方法,在子类中可以用override声明后重写方法a. 2.父类中有方法a,在子类中可以有new修饰符声明后隐藏父类方法. 子类重写方法后,对于子类的任何实例,父类的原方法a都已经不存在. 子类隐藏父类方法后,父类的原方法仍然存在,当子类的实例的类型转为父类时,调用的方法a即为原来的方法. 1 //重写方法 2 class A 3 { 4 public virtual void a() 5 { 6 Console.WriteLine('CLAS

关于在C#中对类中的隐藏基类方法和重写方法的理解

最近在学习C#,在C#中的类看到重写和隐藏基类的方法这些概念.才开始感觉自己不是很理解这些概念.也区分不开这些概念.通过自己的查找资料和练习后.慢慢的理解了类中的隐藏和重写这个概念.在C#中只有在基类定义了一些虚方法才能在派生类中重写基类中的虚方法.但是如果在派生类中使用隐藏方法,就不用在基类中定义虚方法.虚方法和重写实现的功能感觉是差不多的.都是在派生类中改变了基类中的方法,但是两者还是有质的区别,概念的性质也是不一样的.   重写是指:将基类中的方法替换掉,也就是抹掉基类中的原有方法,在派生

Java中的重写

以下内容引用自http://wiki.jikexueyuan.com/project/java/overriding.html: 如果一个类从它的父类继承了一个方法,如果这个方法没有被标记为final ,就可以对这个方法进行重写. 重写的好处是:能够定义特定于子类类型的行为,这意味着子类能够基于要求来实现父类的方法. 在面向对象编程中,覆盖方法意味着去重写已经存在的方法. 示例: 来看以下的例子: class Animal{ public void move(){ System.out.prin

虚方法与重写方法的使用

C#中的多态性在实现时主要是通过在子类(派生类)中重写基类的虚方法或函数成员来实现的,那么这里就遇到两个概念,一个是虚方法,另一个是重写方法,而这两个方法也是多态中最重要的两个概念,下面分别对它们进行讲解. 1.虚方法 虚方法就是允许被其子类重新定义的方法,在声明时,需要使用virtual修饰符. 注意: (1)virtual修饰符不能与static.abstract或者override修饰符同时使用: (2)由于虚方法不能是私有的,所以,virtual修饰符不能与private修饰符同时使用.

什么情况下才要重写Objective-C中的description方法

特别注意: 千万不要在description方法中同时使用%@和self,同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法 1.NSLog回顾   大家都知道,我们可以用NSLog函数来输出字符串和一些基本数据类 1 int age = 11; 2 NSLog( @" age is %d", age); * 第2行的%d代表会输出一个整型数据,右边的变量age会代替%d的位置进行输出 * 输出结果

重写object类中的equals方法

package equalsdemo; /* * 重写object中的equals方法 */ public class equalsdemo { public static void main(String[] args) { person p1 = new person("zhangsan",54); person p2 = new person("zhangsan",54); if (p1.equals(p2)) { System.out.println(&qu

java 重写Object中的hashCode方法-----转载

1 hashCode()用于返回调用该方法的对象的散列码值,此方法将返回整数形式的散列码值. 2 在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址 值,如果equals()相等,说明两个对象地址值也相等,当然hashcode()也就相等了.一旦一个类重写equals()方法,通常也会重写 hashCode()方法. 3 4 下面是重写hashCode()方法的约定的内容,来自Object规范[JavaS

在子类中重载父类的方法(重写方法)

<?php class person{ protected $name; protected $sex; protected $age; function __construct($name,$sex,$age){ $this->name=$name; $this->sex=$sex; $this->age=$age; } function say(){ echo "我的名字:".$this->name.":性别:".$this->

python 类中内置方法的重写

为达成目的,经常会在类中将一些内置方法进行重写,最常见的例如__setattr__,下面就通过内置属性,来查看重写会带来什么变化 先定义一个测试用的类,代码如下 class base: def __init__(self): pass inspect.getmembers(base): # 查看内置属性 打印结果如下 ('__class__', <class 'type'>) ('__delattr__', <slot wrapper '__delattr__' of 'object'