这里不单独讲虚方法和隐藏方法是什么,很多文章都有讲,这里只讲他们的区别和应用理解。
另外:如果你不懂MonoBehaviour就别管他, Debug.Log就是Console.WriteLine
<一>、隐藏方法
一、隐藏方法的背景故事
从前有个了不起的英雄,他有个绝世武功,叫降龙十八掌,于是,他把这个绝世武功,教给了他儿子。但是儿子偷偷和别人学了个武功,叫九阴真经,但是他偷摸学的,没告诉他爸。
于是,就会出现一个好玩的现象:
他爸自己去打架:用降龙十八掌
他爸叫他去打架:他用降龙十八掌
他自己打架:用九阴真经
二、上述需求的代码实现
1.有个爸爸脚本,里面有个方法是降龙十八掌
public class Father: MonoBehaviour
{
public void Fight() {
Debug.Log("降龙十八掌");
}
}
2.儿子继承了爸爸的降龙十八掌
public class Son : Father {
}
3.儿子在打架这方面,偷学了九阴真经
public class Son : Father {
public new void Fight()
{
Debug.Log("九阴真经");
}
}
三、上述代码好玩的结果
public void Start()
{
//爸爸自己去打架
Father father = new Father();
father.Fight(); //会输出降龙十八掌
//爸爸叫你去打架
Father fCallSon = new Son();
fCallSon.Fight(); //会输出降龙十八掌
//你自己去打架
Son son = new Son();
son.Fight(); //会输出九阴真经
}
四、天下代码皆人性(毕竟都是人写的)
这种写法为什么叫做隐藏方法,就是因为瞒上不瞒下,我不想让老爹知道我自己偷着玩,所以叫隐藏方法。
PS:如果再有孙子继承儿子,是直接继承这个隐藏方法,因为老子不能知道,但是告诉儿子就无所谓嘛。
<二>、虚方法
一、虚方法的背景故事
从前有个学武菜鸟,自己学了一辈子,研究了一个武功,叫菜鸟打法。但是,他自知自己武功非常差,他练的时候就告诉自己儿子:“儿子啊,爸只能教你到这了,如果你有能力,你就继续去研究,如果没能力,你就这么用,爸也不怪你”。
因为儿子不怕爸爸,所以他自己就能随心所欲的改,也不怕他爸知道。
于是,就会出现一个和之前不同的现象:
他爸自己去打架:用菜鸟剑法
他爸叫他去打架:用自创剑法(如果没能力自创【就是没重写】,就继续用菜鸟剑法)
他自己打架:用自创剑法(如果没能力自创【就是没重写】,就继续用菜鸟剑法)
二、上述需求的代码实现
1.有个爸爸脚本,里面有个方法是降龙十八掌
public class Father : MonoBehaviour
{
public virtual void Fight() {
Debug.Log("菜鸟剑法");
}
}
2.儿子继承了爸爸的菜鸟剑法
public class Son : Father {
}
3.儿子在打架这方面,建立了自创剑法
public class Son : Father {
public override void Fight()
{
Debug.Log("自创剑法");
}
}
三、上述代码好玩的结果
public void Start()
{
//爸爸自己去打架
Father father = new Father();
father.Fight(); //会输出菜鸟剑法
//爸爸叫你去打架
Father fCallSon = new Son();
fCallSon.Fight(); //会输出自创剑法
//你自己去打架
Son son = new Son();
son.Fight(); //会输出自创剑法
}
四、天下代码皆人性(毕竟都是人写的)
这种写法为什么叫做虚方法,就是因为自己知道自己还有很多地方需要补充,很虚,如果儿子补充了,儿子也能光明正大的让爸爸知道。