日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

项目实战中如何使用抽象类和接口

發布時間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 项目实战中如何使用抽象类和接口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引子:

時常會有這么一個疑惑,抽象類和接口功能好像,真正用起來該如何抉擇呢??

好問題。。

來看看書上怎么說的(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




總結

以上是生活随笔為你收集整理的项目实战中如何使用抽象类和接口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。