[Unity&C#&继承]unity怎么改变继承子类的父类的函数

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

看看效果

---------------------------------------------------------1.1一般的继承,并在新的脚本 调用 继承父类的子类的函数

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();
    }
}
显示结果:

---------------------------------------------------------1.2

Test_Father.cs:没有发生改变

Test_FSChange:也没有发生改变

new, virtual,几种方式继承,现在一一测试

Test_Son.cs:使用参考资料 2 ,里面 的 virtual 方法 来改变 父类的函数

-------------------

1.2.1 使用virtual 继承

1.2.1.1 把virtual 关键字继承 放在 public 后,void 前面

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test_Son : Test_Father {
    public virtual void test_father()
    {
        Debug.Log("  test_son  ");
    }
}
显示结果:

1.2.2.2把virtual 关键字继承 放在 public 前面

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 ");
    }
}
显示结果 正常。

-------------------

1.2.2没有关键字 继承

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test_Son : Test_Father {
     public void  test_father()
    {
        Debug.Log("  test_son _1 ");
    }
}

显示结果 正常。

-------------------

1.2.3 使用new 关键词 继承

1.2.3.1 new 关键词放在 public 前面

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 ");
    }
}
显示结果 正常。
-------------------

1.2.4 使用 new 和 virtual 两个关键词

1.2.4.1

using UnityEngine;

public class Test_Son : Test_Father {
    new public virtual void test_father()
    {
        Debug.Log("  test_son _1 ");
    }
}

1.2.4.2 public new virtual void test_father()

1.2.4.3 virtual public new void test_father()

1.2.4.4 virtual new public void test_father()

结果无一例外,都是 显示结果 正常。

-------------------

得出一个结论:不管继承的 关键词 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 函数。

类似另一种形式的 继承

---------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------

2.1 如果在 父类 test_father 的函数 test_father() 中添加一个 变量 int test_father_int = 666;

[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第1张图片[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第2张图片

[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第3张图片


2.2 当在子类 test_son 中 试图调用 tese_father 的 test_father_int 变量的时候,显示 该变量不存在

2.2.1 不改变 在 test_father 中 的 test_father_int 类型。

[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第4张图片


2.2.2改变了 在 test_father 中 的 test_father_int 类型。发现 test_father_int 为函数的局部变量。不能这样定义。

[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第5张图片


2.2.3 把 test_father_int 改为 Test_Father 的公共变量 的时候,是可以进行调用的。

[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第6张图片显示是可以 在子类 调用的。

2.2.3 .1

[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第7张图片[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第8张图片

显示结果为0

[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第9张图片


得出结论: 当子类 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 如果 父类 Test_Father 的 test_father()函数,有形参,会怎么样

3.1.1

[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第10张图片[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第11张图片[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第12张图片[Unity&C#&继承]unity怎么改变继承子类的父类的函数_第13张图片

可以 得出结论:

在父类 的 string 类型的形参

在子类 的 int 类型 的形参 ,虽然两者的 函数名相同。实际上 从 函数括号里面 () 有无形参,类型 的时候开始。

就已经不是相同的 一个 函数了。(这个技巧 是 C# 中的 重载,参考资料 4)


----------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------

参考资料:

1.

继承的顺序,子类覆盖继承父类的方法

2.

unity怎么不能用virtual关键字 怎么通过父类调子类方法

3.

C#中virtual,override,new的区别

4.C#之重载与覆盖

5.

6.

7.

8.







你可能感兴趣的:(Unity,C#,Unity对象,代码分析,继承,继承,脚本,c#,游戏开发,游戏制作)