鹤岗信息港:Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方式的结构重复问题&泛型:结构复用利器

admin 5个月前 (05-01) 科技 27 0

第四章 简介

方式的结构重复问题

我们在上一篇正式整理完毕,从这一篇最先,我们要再次进入学习网络示例阶段了。

那么我们学什么呢?固然是学习设计工具,也就是在上篇中提到的要害知识点。这些要害知识点,大部门来自于 C# 语法。

不外在此之前,我们先实现一个功效,这个功效是,传入几个数字,随机取出其中一个数字。

好比传入 1,3,5,7 从这四个数字中随机取出一个数字出来。

实在现很简单 代码如下:

using UnityEngine;

namespace QFramework
{
	public partial class MathUtil
	{
		public static int GetRandomValueFrom(int[] values)
		{
			return values[Random.Range(0, values.Length)];
		}
	}
}

传入一个,int 数组,从 int 类型数组中随机取一个数值举行返回。

用法也很简单,使用代码如下:

var randomValue = GetRandomValueFrom(new int[] {5, 100, -1, -3, 5});

然则随着时间生长,我们有时刻会需要随机获取其他类型值,好比从一个 float 类型的数组中随机取回一个 float 值,或者是从 string 类型的数组中取回一个值。

岂非我们要每个类型都实现一次嘛? 若是都实现一次的话,会增多许多重复结构的代码,注重看这里是重复的结构。

什么叫重复的结构,以下代码就是三个重复结构的方式。

public static int GetRandomValueFrom(int[] values)
{
	return values[Random.Range(0, values.Length)];
}

public static string GetRandomValueFrom(string[] values)
{
	return values[Random.Range(0, values.Length)];
}

public static float GetRandomValueFrom(float[] values)
{
	return values[Random.Range(0, values.Length)];
}

虽然对初学者来说,知道把方式做成工具类已经很不容易了,然则以上这样的代码肯定是不行的。

以是就要学习新的知识,然则笔者接下来要说的这个知识人人应该很熟悉了。

就是面试中常问的:面向工具的特征?
答:封装、继续、多态。

而我们要用其中的继续特征。

我们先温习一下继续:B 继续 A,那么 B 工具就可以拥有 A 中的 public、protect 方式和成员变量。
温习完了。。。

继续的本质是,什么是什么的问题,好比 B 继续 A,那么我们可以使用 A 变量去吸收 B 工具。
代码如下:

class A
{
}

class B : A
{
}

A a = new B();

这样的的代码是没问题的。

虽然以上代码和多态性有一点关系,不外我们只要记着,父类的变量可以吸收子类的实例这个结论就好了。

那么对我们的问题有什么辅助呢?

我么再来看下问题代码:

public static int GetRandomValueFrom(int[] values)
{
	return values[Random.Range(0, values.Length)];
}

public static string GetRandomValueFrom(string[] values)
{
	return values[Random.Range(0, values.Length)];
}

public static float GetRandomValueFrom(float[] values)
{
	return values[Random.Range(0, values.Length)];
}

int、string、float 若是有一个配合的父类,那么就可以用一个配合的父类,作为参数的类型。

那么 int、string、float 有没有配合的父类?谜底是有的,它们配合继续了 object 类。不止是int、string、float,C# 中的所有类型都继续了 object 类。

我们有了谜底,可以举行更改了,改完的代码如下:

public static object GetRandomValueFrom(object[] values)
{
	return values[Random.Range(0, values.Length)];
}

我们看下使用的代码

var intRandomValue = (int)GetRandomValueFrom(new int[]{1,2,3});
var stringRandomValue = (string)GetRandomValueFrom(new string[]{"asdasd","123123"});
var floatRandomValue = (float)GetRandomValueFrom(new float[]{ 0.1f,0.2f });

使用的代码虽然对照难看(1.强制类型转换;2.再加上每次传入参数都要组织数组;)

使用上有一点贫苦,不外还好,我们最起码解决了结构重复的问题,而且我们还温习了一下继续。

固然除了使用 object 吸收,另有更好的方式-使用泛型。之以是先先容 object ,是因为,笔者在没接触泛型之前,都是这么搞的,这样搞实在另有个问题,就是值类型转引用类型会造成效率问题,不外这些问题下一篇再解决,更主要的是,我们今天的问题得到了希望,这是很值得开心的。

泛型:结构复用利器

在上一篇我们使用 object 解决了方式结构重复的问题,而在文章的尾部又提了一下更好的方式,就是泛型。

泛型对许多初学者来说是对照高级的观点,这里呢我们顺便温习一下泛型。

泛型是什么呢?对于方式来说,方式结构中的部门或所有类型都可以先不举行界说,而是到挪用方式的时刻再去界说。

我们的 GetRandomValue 的现在代码如下 :

public static object GetRandomValueFrom(object[] values)
{
	return values[Random.Range(0, values.Length)];
}

测试代码如下:

var intRandomValue = (int)GetRandomValueFrom(new int[]{1,2,3});
var stringRandomValue = (string)GetRandomValueFrom(new string[]{"asdasd","123123"});
var floatRandomValue = (float)GetRandomValueFrom(new float[]{ 0.1f,0.2f });

将 object 改成泛型后如下:

public static T GetRandomValueFrom<T>(T[] values)
{
	return values[Random.Range(0, values.Length)];
}

测试代码如下:

var intRandomValue = GetRandomValueFrom(new int[]{1,2,3});
var stringRandomValue = GetRandomValueFrom(new string[]{"asdasd","123123"});
var floatRandomValue = GetRandomValueFrom(new float[]{ 0.1f,0.2f });

从测试代码中可以对照出来,使用泛型之后的代码确实好用了许多。

人人思索下泛型是不是这样的?结构中的部门或所有类型都可以先不举行界说,而是到挪用的时刻再去界说。

我们有收获了一个法宝泛型。要说方式是逻辑上的复用,那么泛型就是结构上的复用。两大复用法宝。

关于泛型就先先容到这里,我们以后还会遇到使用泛型的时刻的。

在看下当前的测试代码:

var intRandomValue = GetRandomValueFrom(new int[]{1,2,3});
var stringRandomValue = GetRandomValueFrom(new string[]{"asdasd","123123"});
var floatRandomValue = GetRandomValueFrom(new float[]{ 0.1f,0.2f });

现在对照贫苦的是数组组织代码了。

这个也是有设施搞定的。我们把方式的实现改成如下:

public static T GetRandomValueFrom<T>(params T[] values)
{
	return values[Random.Range(0, values.Length)];
}

人人注重下,参数前边加上了一个 params 要害字。这个是什么意思呢?
意思是 GetRandomValueFrom 可以传随便数目的参数。

我们先看下测试代码,测试代码呢实在可以改成如下:

var intRandomValue = GetRandomValueFrom(1, 2, 3);
var stringRandomValue = GetRandomValueFrom("asdasd", "123123");
var floatRandomValue = GetRandomValueFrom(0.1f, 0.2f);

是不是清新了许多?这就是 params 的用法。

而通过 params 修饰的 values 参数来说,若是传入的是一个数组,那么 values 自己就是这个数组,若是传入的是若干个值,那么 values 中就包含了这若干个值。

总结一句话,就是可以传一整个数组,也可以传若干个参数,设计得异常人性化。

到此呢,我们的第九个示例就已经异常完善了。

所有代码如下:

using UnityEngine;

namespace QFramework
{
	public partial class MathUtil
	{
#if UNITY_EDITOR
		[UnityEditor.MenuItem("QFramework/9.从若干个值中随机取出一个值", false, 10)]
#endif
		private static void GetRandomValueFromMenuClicked()
		{
			Debug.Log(GetRandomValueFrom(1, 2, 3));
			Debug.Log(GetRandomValueFrom("asdasd", "123123"));
			Debug.Log(GetRandomValueFrom(0.1f, 0.2f));
		}

		public static T GetRandomValueFrom<T>(params T[] values)
		{
			return values[Random.Range(0, values.Length)];
		}
	}
}

代码执行效果如下:

编译之后菜单如下

目录结构如下

我们举行一次导出,这次导出就正常导出就好。

今天的内容就到这里,我们下一篇再见,拜拜~。

转载请注明地址:凉鞋的条记:liangxiegame.com

更多内容

  • QFramework 地址:https://github.com/liangxiegame/QFramework

  • QQ 交流群:623597263

  • Unity 进阶小班

    • 主要训练内容:
      • 框架搭建训练(第一年)
      • 随着案例学 Shader(第一年)
      • 副业的孵化(第二年、第三年)
    • 权益、授课形式等详细详情请查看《小班产物手册》:https://liangxiegame.com/master/intro
  • 关注民众号:liangxiegame 获取第一时间更新通知及更多的免费内容。

,

进入sunbet官网手机

欢迎进入进入sunbet官网手机!Sunbet 申博提供申博开户(sunbet开户)、SunbetAPP下载、Sunbet客户端下载、Sunbet代理合作等业务。

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:1453
  • 页面总数:0
  • 分类总数:8
  • 标签总数:2545
  • 评论总数:297
  • 浏览总数:33369