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

引子:

时常会有这么一个疑惑,抽象类和接口功能好像,真正用起来该如何抉择呢??

好问题。。

来看看书上怎么说的(C#7.0本质论)

虽然方法可在基类中声明为抽象成员,但是!!如果都从一个基类派生,会用掉唯一的基类机会,(什么意思呢:也就是C#的单继承特性了),所以,什么都往基类里面加,就会显得特别臃肿,且不通用。

所以,原则就是:大共性你给我放基类,小共性用接口。

举个例子:一个动物基类(包含动物叫、动物吃放、动物睡觉) --  这都没问题!!

但是你给动物的基类里面加一个动物飞行(虽然动物里面的鸟、鸡等都可以飞,但是喵和狗你怎么飞啊),所以,这个加的就很不理智,虽然也是个共性,但是个小共性。

所以,这个小共性用接口实现就非常的Nice,为何呢(因为C#是单继承多接口啊!),也就是说,你的狗子不会飞就不要来接触这个接口咯,会飞的动物,除了继承基类,再加个接口就OK了。

正文:

还是基于游戏,我想到了一个场景,就借这个场景来实战一下吧。

场景描述:

1、三个人(剑士、奶妈、格斗家)组团刷副本

2、三个人的大共性有三条(移动、攻击、聊天)

3、奶妈的可以加团体Buff和团体回血

4、格斗家可以加团体Buff

5、剑士可以加自身Buff

这时候呢:很显然就把移动、打怪、聊天设置为基类了;而剩下的则以接口出现,当然至于为什么要用接口,可以看上一篇关于抽象类的文章,道理差不多。

640?wx_fmt=jpeg

第一步:先定义一个基类(三个职业共性)

    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();

}

实现:

640?wx_fmt=jpeg

实验代码:https://github.com/TNever/Interfaceandabstract.git


640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

番茄日志发布1.0.3版本-增加Kafka支持

番茄日志(TomatoLog)能做什么可能你是第一次听说TomatoLog,没关系,我可以从头告诉你,通过了解番茄日志,希望能帮助有需要的朋友,番茄日志处理将大大降低你采集、分析、处理日志的过程。介绍Toma…

Java String类型变量的比较问题

今天写程序的时候,发现了一个很奇怪的问题,代码如下: if((address.getCountry())!"国家"){ ad.insertAddress(address); //将只有国家、省份、城市三列的Address对象插入到数据库表格中 } 其中,我设置了断点进行调试…

P2494 [SDOI2011]保密(网络流/最小割/01分数规划)

P2494 [SDOI2011]保密 这道题是一个很综合的题目 首先有一个二分图,到达一个点就可以到达所有该点相连的边,然后需要覆盖所有边,然后给定一张图你从起点出发然后可以到达二分图的节点,保证没有环,每条边有时间和花费&…

B. Product(2019ICPC西安邀请赛)(杜教筛)

Product ∑i1n∑j1n∑k1ngcd⁡(i,j)[k∣gcd⁡(i,j)]∑k1n∑i1nk∑j1nkgcd⁡(ik,jk)∑k1nk∑i1nk∑j1nkgcd⁡(i,j)∑k1nk∑d1nkd∑i1nkd∑j1nkd[gcd⁡(i,j)1]∑k1nk∑d1nkd(∑i1nkd2ϕ(i)−1)Tkd∑T1n∑k∣TkTk(∑i1nT2ϕ(i)−1)∑T1nTσ0(T)(∑i1nT2ϕ(i)−1)\sum_{i 1} ^{n} …

ArangoDB 3.5发布:流事务API、蒙面数据、搜索性能大幅提升、最短路径功能

ArangoDB 3.5 发布了。ArangoDB 是一个分布式原生的多模型数据库,具有灵活的文档、图形和键值数据模型。使用方便的 SQL 查询语言或 JavaScript 扩展构建高性能应用程序。此版本亮点包括:期待已久的 Streaming Transactions API,可以直接使用…

Java StringBuffer相关解惑

在编程过程中遇到的StringBuffer初始化以及赋值的时候,遇到的问题。 StringBuffer sbnew StringBuffer(); // StringBuffer sb1new StringBuffer(1000); // System.out.println("sb capacity:"sb.capacity()); //默认容量是16,StringB…

P3511 [POI2010]MOS-Bridges(网络流/欧拉回路)

P3511 [POI2010]MOS-Bridges 给出一个图,边正着走和反着走的边权不同,求解最大边权最小的欧拉回路,输出方案。 首先看到最大边权最小我们就可以想到二分答案,然后现在在剩余的图上我们要判断是否存在欧拉回路,我们可…

Easy Math(ACM-ICPC 2018 徐州赛区网络预赛)(递归 + 杜教筛)

Easy Math 推式子 ∑i1mμ(in)∑i1mμ(indd),d是n的一个质因子i,d互质项有(−∑i1mμ(ind)),由于减去了多余的非互质项,所以加上,−∑i1mμ(ind)∑i1mdμ(idnd)−∑i1mμ(ind)∑i1mdμ(in)\sum_{i 1} ^{m} \mu(in)\\ \sum_{i 1…

英雄会在线编程题目(请大家不吝赐教)

<span style"font-size:18px;">最近看了一道英雄会在线编程题目&#xff0c;题目的介绍如下&#xff1a;</span> <span style"font-size:18px;"></span> <span style"font-size:18px;">题目详情&#xff1a;</…

P2304 [NOI2015] 小园丁与老司机(网络流/上下界网络流)

P2304 [NOI2015] 小园丁与老司机 平面上有n个点&#xff0c;每次可以向左、右、上、左上45度、右上45度移动&#xff0c;然后直线移动到达第一个没有到过的点&#xff0c;如果没有这样的点就不能移动&#xff0c;求解一条最长路&#xff0c;然后求解将所有可能不是左右移动的道…

ASP.NET Core on K8S深入学习(7)Dashboard知多少

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。在第二篇《部署过程解析与Dashboard》中介绍了如何部署Dashboard&#xff0c;但是没有更多地介绍如何使用Dashboard&#xff0c;本文就来对Dashboard的使用进行补充。…

Convex Hull (ACM-ICPC 2018 沈阳赛区网络预赛) 存个公式

Convex Hull gay(i){0ifikxx,x>k,k>1iielse}求∑i1n∑j1igay(j)∑i1n(n−i1)gay(i)∑i1n(n−i1)μ2(i)i2因为μ2(n)∑i2∣nμ(i)&#xff0c;容斥定理显然得到有原式∑i1n(n−i1)i2∑j2∣iμ(j)(n1)∑i1n∑j2∣iμ(j)−∑i1ni3∑j2∣iμ(j)(n1)∑j1nμ(j)∑j2∣ii2−∑j1…

程序员的自我修养

一、技术类——互联网天际的摘星者 Unix环境高级编程&#xff08;第3版&#xff09; 编程珠玑 Python核心编程&#xff08;第二版&#xff09; 算法谜题 JavaScript框架设计 鸟哥的Linux私房菜 基础学习篇(第三版) 游戏机制——高级游戏设计技术 第一本Docker书 Swift …

多项式对数函数|指数函数(多项式)

多项式对数函数|指数函数 这个思路就是先求导然后再积分&#xff0c;这样就可以得到一个式子&#xff0c;对于多项式对数函数&#xff0c;我们就可以直接求解了&#xff0c;然后对于多项式指数函数还需要使用分治fft。 多项式对数&#xff1a; #include<bits/stdc.h> …

P5221 Product(反演)

P5221 Product 推式子 ∏i1n∏j1nlcm(i,j)gcd(i,j)∏i1n∏j1nijgcd(i,j)2我们考虑上面∏i1n∏j1nij∏i1nin∏j1nj∏i1ninn!n!n∏i1nin最后得到n!2n再考虑下面化简∏i1n∏j1ngcd(i,j)2∏d1nd2∑i1nd∑j1nd[gcd(i,j)1]对∑i1nd∑j1nd[gcd(i,j)1]化简∑k1ndμ(k)(nkd)2整体化简后…

【学习笔记】Docker - 02. 在容器中运行软件(上)

2.1 控制容器: 构建一个网站监视器 需求: 客户想让你做一个网站, 这个网站需要被紧密的监视, 如果服务器宕机了, 那么它们的团队会收到相关的邮件. 这里用到了3个容器. 第一个运行NGINX; 第二个运行一个叫做mailer的程序. 这两个容器都是detached的. Detached 表示容器将在后台…

P4249 [WC2007]剪刀石头布(网络流/费用流)

P4249 [WC2007]剪刀石头布 在一个竞赛图上一些边的方向已经确定&#xff0c;但是还有一些边的方向没有确定&#xff0c;求解最多有多少三元环。 首先看到三元环个数&#xff0c;按照套路我们利用度数计算&#xff0c;然后考虑每一条边&#xff0c;每一条边的贡献就是使两个点…

算法学习之旅

问题&#xff1a;设计一个算法&#xff0c;计算出n阶乘中尾部零的个数 例如: 11! 39916800&#xff0c;因此应该返回 2 挑战&#xff1a;O(logN)的时间复杂度 想法1&#xff1a; 找出1–n中每个数字能够被5或者10整除的次数&#xff0c;加在一起就是答案。但是时间复杂度是…

P6810 「MCOI-02」Convex Hull 凸包

P6810 「MCOI-02」Convex Hull 凸包 思路 ∑i1n∑j1mτ(i)τ(j)τ(gcd(i,j))∑d1nτ(d)∑i1nd∑j1mdτ(id)τ(id)[gcd(i,j)1]∑d1nτ(d)∑k1ndμ(k)∑i1ndk∑j1mdkτ(idk)τ(idk)tkd∑t1n∑i1ntτ(it)∑j1mtτ(jt)∑d∣tτ(d)μ(td)∑d∣tτ(d)μ(td)τ∗μ,有τ(n)∑d∣n∑d∣…

P6295 有标号 DAG 计数(多项式指数函数对数函数/二项式反演/动态规划/生成函数)

P6295 有标号 DAG 计数 https://www.luogu.com.cn/problem/P6295 求解n个点的有标号弱联通DAG个数 首先根据exp的组合意义&#xff0c;我们考虑指数型生成函数&#xff0c;那么我们先求出不要求弱联通的个数&#xff0c;然后ln回去就是弱联通的DAG个数。 然后考虑进行dp&…