一、背景故事
我们正常写的脚本,一般都是非常完整的,脚本完整意味着需求完整。
例如,我是售货员,现在苹果5元,梨子3元,西瓜20元,
一个人,来买了5个苹果,4个梨子,1个西瓜,问多少钱?
这样的代码都很好写,因为需求完整,想法完整,逻辑清晰。
二、残酷的现实
现实往往没办法一下考虑那么多。
例如:现在我不知道买东西的人拿了什么,但是我必须先把式子列出来,我必须把计算公式列出来,可我也不知道买了多少,每个东西多少钱,这都要后面补充,但我现在就要硬算。
解决方案:那我就假设有个数组FruitsPrice,
里面是它拿的所有东西的单价,我给他们加起来
//这就是假设的那个数组
int[] FruitsPrice;
public int result() {
int sum = 0;
foreach (int price in FruitsPrice())
{
sum += price;
}
return sum;
}
但是有个问题,我们的int数组,本质上是不知道的,而且,我们以后还要去改它,所以,我们要把它写成一个方法。
然后就报错了~~接下来就变成了一个死循环。。
我们不知道这个数组→我们又需要这个数组→这个数组我们不知道
三、所有语法都是为了解决实际问题-------abstract
当挂上abstract后,它再也不会要求你写代码了,因为它默认这就是个假设,是个半成品,它也就让你过了。(不用加{},因为不需要你去写方法)
如果,你这时候还被报错了,你大概是遇见
这个理由也很简单,它发现你这个脚本里,有方法是半成品啊,
它就觉得,保不齐,这个代码也执行不了,里面的方法也不能用,
所以,这个脚本,默认是个不能直接使用的脚本,
我们就也必须把这个脚本叫做假设脚本或者抽象脚本,抽象的就是不能用的嘛!
我们现在整体代码就是:
using UnityEngine;
public abstract class Test_Abstract : MonoBehaviour
{
public abstract int[] FruitsPrice();
public int result()
{
int sum = 0;
foreach (int price in FruitsPrice())
{
sum += price;
}
return sum;
}
}
四、我不能直接写int吗?
a.可能你会好奇,我刚才是写了一个可以传递int数组的方法,如果我直接声明数组可以吗?
例:
肯定不可以啊,都说了abstract是个假设,假设就是不知道是多少,可是从你声明的那一刻起,你就知道他是多少了(如果不设置值,默认为0),都知道了,就不是假设了,所以不可以。
b.那如果我硬要设置呢?
我们有抽象访问器,就是
因为这个没有默认值,所以是可以设置哒。
五、abstract总结
1.官方话:抽象类不能实例化。在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
人话:写抽象方法的时候,不能实现(就是不能加{},然后往里面写内容)
吐槽:抽象方法就是因为没法实现才写抽象,能实现就直接写方法了.........
2.官方话:只允许在抽象类中使用抽象方法声明。
人话:抽象方法必须写在抽象类里
吐槽:(方法都是假设的了,你脚本只能是假设的)
3.官方话:从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
人话:我们写的都是假设方法了,用的话,不能直接new 一个,都是假的,所以没法new,只能用继承的方法,继承了以后,如果一直是假的,你就还是没办法用,所以继承以后,必须重写(override)一下这个方法,要不然会导致你的子子孙孙无穷假设,脚本都是坏掉的。