项目实战中如何使用抽象类和接口
引子:
時常會有這么一個疑惑,抽象類和接口功能好像,真正用起來該如何抉擇呢??
好問題。。
來看看書上怎么說的(C#7.0本質論)
雖然方法可在基類中聲明為抽象成員,但是!!如果都從一個基類派生,會用掉唯一的基類機會,(什么意思呢:也就是C#的單繼承特性了),所以,什么都往基類里面加,就會顯得特別臃腫,且不通用。
所以,原則就是:大共性你給我放基類,小共性用接口。
舉個例子:一個動物基類(包含動物叫、動物吃放、動物睡覺) --? 這都沒問題!!
但是你給動物的基類里面加一個動物飛行(雖然動物里面的鳥、雞等都可以飛,但是喵和狗你怎么飛啊),所以,這個加的就很不理智,雖然也是個共性,但是個小共性。
所以,這個小共性用接口實現就非常的Nice,為何呢(因為C#是單繼承多接口啊!),也就是說,你的狗子不會飛就不要來接觸這個接口咯,會飛的動物,除了繼承基類,再加個接口就OK了。
正文:
還是基于游戲,我想到了一個場景,就借這個場景來實戰一下吧。
場景描述:
1、三個人(劍士、奶媽、格斗家)組團刷副本
2、三個人的大共性有三條(移動、攻擊、聊天)
3、奶媽的可以加團體Buff和團體回血
4、格斗家可以加團體Buff
5、劍士可以加自身Buff
這時候呢:很顯然就把移動、打怪、聊天設置為基類了;而剩下的則以接口出現,當然至于為什么要用接口,可以看上一篇關于抽象類的文章,道理差不多。
第一步:先定義一個基類(三個職業共性)
public class Abstract{
public abstract class AbstractAction
{
public abstract void Action();
}
public class Move : AbstractAction
{
public override void Action()
{
// 英雄移動
Console.WriteLine("正在移動");
}
}
public class Attack : AbstractAction
{
public override void Action()
{
// 英雄攻擊
Console.WriteLine("開始打怪");
}
}
public class Call : AbstractAction
{
public override void Action()
{
// 聊天
Console.WriteLine("Hi、妹子...");
}
}
}
第二部:定義兩個接口(回血和加Buff)
interface IAddMilk{
void AddMilk();
}
interface IAddBuff
{
void AddBuff();
}
第三部:定義三個英雄
? ?劍士(調用加Buff接口):
public class Swordsman : IAddBuff{
private AbstractAction action;
public Swordsman() { }
public void Select(AbstractAction action)
{
this.action = action;
}
public void Go()
{
action.Action();
}
public void AddBuff()
{
Console.WriteLine("我只給自己加Buff");
}
}
? ? 格斗家(調用加Buff接口):
public class Fighter : IAddBuff{
private AbstractAction action;
public Fighter() { }
public void Select(AbstractAction action)
{
this.action = action;
}
public void Go()
{
action.Action();
}
public void AddBuff()
{
Console.WriteLine("我給團體加Buff");
}
}
? ? 奶媽(調用加Buff和加奶接口):
public class Nanny : IAddBuff,IAddMilk{
private AbstractAction action;
public Nanny() { }
public void Select(AbstractAction action)
{
this.action = action;
}
public void Go()
{
action.Action();
}
public void AddBuff()
{
Console.WriteLine("我給團體加Buff");
}
public void AddMilk()
{
Console.WriteLine("我給團體回血");
}
}
第四部:實例化三個職業并完成以下功能:
奶媽進圖加Buff、加血、順便和格斗家姑娘打個招呼;格斗家加上團體Buff開始打怪;劍士加上個人Buff開始打怪。
static void Main(string[] args){
// 實例化一個名叫小明的奶媽并進行加Buff和回血,順便還打了一聲招呼
Nanny cat = new Nanny();
Console.WriteLine("我是奶媽小明");
cat.AddBuff();
cat.AddMilk();
cat.Select(new Call());
cat.Go();
Console.WriteLine("------------");
// 實例化一個名叫小強的格斗家,先加個團體Buff,再攻擊小怪
Console.WriteLine("我是副C小強");
Fighter SmallC = new Fighter();
SmallC.AddBuff();
SmallC.Select(new Attack());
SmallC.Go();
Console.WriteLine("------------");
// 實例化一個主C小帥,先給自己加個Buff,然后打怪。
Console.WriteLine("我是主C");
Swordsman xuxubaobao = new Swordsman();
xuxubaobao.AddBuff();
xuxubaobao.Select(new Attack());
xuxubaobao.Go();
}
實現:
實驗代碼:https://github.com/TNever/Interfaceandabstract.git
總結
以上是生活随笔為你收集整理的项目实战中如何使用抽象类和接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对Windows桌面应用程序进行UI自动
- 下一篇: 番茄日志发布1.0.3版本-增加Kafk