A.cs为父类,B.cs为子类,B.cs继承A.cs
C.cs为另外一个脚本,新建一个 B.cs类型 的变量 X,X变量调用 父类 A.cs 的测试函数test_father
本文 为了 搞明白 ,如果 改变 B.cs 中的 属于父类A.cs的函数test_father。应该如何做
----------------------------------------------------------------------------------------------------------------------------------------
A.cs为父类,B.cs为子类,B.cs继承A.cs
C.cs为另外一个脚本,新建一个 B.cs类型 的变量 X,X变量调用 父类 A.cs 的测试函数test_father
看看效果
Test_Father.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_Father : MonoBehaviour {
public void test_father()
{
Debug.Log(" test_father ");
}
}
Test_Son.cs:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_Son : Test_Father {
// Use this for initialization
void Start () {
}
}
Test_FSChange:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_FSChange : MonoBehaviour {
private Test_Son ts;
// Use this for initialization
void Start () {
Test_Son ts = new Test_Son();
ts.test_father();
}
}
显示结果:
Test_Father.cs:没有发生改变
Test_FSChange:也没有发生改变
new, virtual,几种方式继承,现在一一测试
Test_Son.cs:使用参考资料 2 ,里面 的 virtual 方法 来改变 父类的函数
-------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_Son : Test_Father {
public virtual void test_father()
{
Debug.Log(" test_son ");
}
}
显示结果:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_Son : Test_Father {
virtual public void test_father()
{
Debug.Log(" test_son _1 ");
}
}
显示结果 正常。
-------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_Son : Test_Father {
public void test_father()
{
Debug.Log(" test_son _1 ");
}
}
-------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_Son : Test_Father {
new public void test_father()
{
Debug.Log(" test_son _1 ");
}
}
显示结果 正常。
1.2.3.2new 关键词放在 public 后面
using UnityEngine;
public class Test_Son : Test_Father {
public new void test_father()
{
Debug.Log(" test_son _1 ");
}
}
显示结果 正常。
using UnityEngine;
public class Test_Son : Test_Father {
new public virtual void test_father()
{
Debug.Log(" test_son _1 ");
}
}
结果无一例外,都是 显示结果 正常。
-------------------
得出一个结论:不管继承的 关键词 new 和 virtual 是否 在 函数名字哪个位置,只要在 这个函数返回值类型 void 或者string ,int 前面即可。
子类 B.cs 继承父类 A.cs ,并改变 A.cs 的函数test_father(),可以不用关键词。
-------------------
通过 阅读 林锐-高质量C编程 第10 章 类的继承和组合,78-81页的内容,可以理解
实际上 Test_FSChange 通过
private Test_Son ts;
新建了一个 对象 ts ,并通过这个对象ts 来调用,Test_Father的test_father 函数。
类似另一种形式的 继承
---------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------
显示结果为0
得出结论: 当子类 Test_Son 中 继承 Test_Father 的 test_father()函数的时候, 如果 在 子类 Test_Son 中 改变 了test_father()函数 的时候,再调用 子类 Test_Son 中 test_father()函数 ,并显示的 时候, 以 子类 Test_Son 中 test_father()函数 为准。
也就是说 子类 B.cs继承 父类 A.cs 的test_A函数,并改变了test_A函数,就会把 父类 A.cs 的test_A函数 清空 ,实际显示的是子类 B.cs 的test_A函数。
----------------------------------------------------------------------------------------------------------------------------------------
3.1.1
可以 得出结论:
在父类 的 string 类型的形参
在子类 的 int 类型 的形参 ,虽然两者的 函数名相同。实际上 从 函数括号里面 () 有无形参,类型 的时候开始。
就已经不是相同的 一个 函数了。(这个技巧 是 C# 中的 重载,参考资料 4)
----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------
参考资料:
1.
2.
3.
4.C#之重载与覆盖
5.
6.
7.
8.