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

引子:

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

好问题。。

来看看书上怎么说的(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…

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

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

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

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

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

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

lintcode 有效的括号序列

心血来潮,半夜做了一道Lintcode的题目,调试完睡觉,欢迎大家批评指正。 public boolean isValidParentheses(String s) {// Write your code hereStack stacknew Stack();if(s.length()0){return true;}else if(s.length()1){return false;}fo…

2019 年 8 月编程语言排行榜,C#重回增长之路

至于火热的 Python,其占有率还是保持着一如既往的增长势头,由 7 月的 9.260% 上升到现在的 10.020%。C 的占有率则稍有下降,由 6.705% 下降到了 6.057%,C# 和 Visual Basic .NET 分别呈现出增长和下降的趋势。可能是本期榜单没什么…

asp.net core系列 71 Web架构分层指南

一.概述本章Web架构分层指南,参考了“Microsoft应用程序体系结构指南”(该书是在2009年出版的,当时出版是为了帮助开发人员和架构师更快速,更低风险地使用Microsoft平台和.NET Framework设计和构建有效,高质量的应用程…

C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)

一、为什么使用泛型?泛型其实就是一个不确定的类型,可以用在类和方法上,泛型在声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有在调用者调用时,传入指定的类型,才会用确切的类型…

谈自由,ASP.NET Core才是未来?

首先我要说一下自己对自由的理解:自由是我可以选择不干什么,但我要保留我可以干什么的可能性。比如说我现在只有一个码农的角色,但我仍然要保留可以扮演其他角色的可能,比如成为一个作者,当我写下文章的时候已经是了&a…

今天,全网曝光这几个公众号

有人统计过,我们平均每天花在看内容上的时间是5-6小时与其每天被各种看过就忘的内容占据时间不如看点真正对你有价值的信息下面小编为你推荐几个高价值的公众号,这些公众号都是专注.NET技术它们提供的信息能真正提高你生活的质量当你迷茫的时候刷刷这些大…

.NET Core 小程序开发零基础系列(1)——开发者启用并牵手成功

最近几个月本人与团队一直与小程序打交道,对小程序的实战开发算比较熟悉,也因一些朋友经常问我各种小程序问题,无不能一一回答,想了很久,决定还是空余时间来写写文章吧,偶尔发现一个人安静的时候写文章特爽…

学习笔记之12个月提升计划

Java世界博大精深,有太多的东西要学。如果一头扎进去,很可能会淹没在Java技术的海洋里。于是,最近一直在思考列一个提纲,作为高级工程师到资深、再到架构之路的路标。 学习笔记一栏,即为本计划的博客记录。将自己的计划…

从“梁漱溟:思考问题有八层境界”所联想到的

最近一段时间以来写的文章比较少了,这固然是有一些客观原因,但确实有我不可说的一些自我反省和认识等主观因素。记得8月初有一次友人聚餐,席间有朋友聊到公众号的运营心得体会,其中有一条是:避免粉丝减少的黄金法则之一…

程序员过关斩将--cookie和session的关系其实很简单

喜欢就点关注吧!月高风下,下班路上....菜菜哥,告诉你一个秘密,但是不允许告诉任何人这么秘密,你有男票了?~不是,昨天我偷偷去面试了,结果挂了这不是好事吗,上天让公司留住你.....好吧…

.NET导出Excel的四种方法及评测

前言导出Excel是.NET的常见需求,开源社区、市场上,都提供了不少各式各样的Excel操作相关包。本文,我将使用NPOI、EPPlus、OpenXML、Aspose.Cells四个市面上常见的库,各完成一个导出Excel示例。然后对其代码风格和性能做一个横向比…

[2021.1.27多校省选模拟10]染色(min-max容斥/二项式反演)

[2021.1.27多校省选模拟10]染色 突然发现我对概率期望的理解不是很好。。。 部分分1:可以直接进行状压dp,然后按照题意模拟即可。 部分分2:首先可以发现这个问题是min_max容斥形式,然后对于min(T)的问题,我们将问题转…

[2021.1.27多校省选模拟10]跑步(线段树合并)

[2021.1.27多校省选模拟10]跑步 经典的树上启发式合并题目,维护对应子树的从当前点到子树内一个节点这个链待定,其他部分已经确定的方案数,这个东西按照对应点到根节点的路径点权和为下标存在一个权值线段树中,然后维护这个权值线…

ASP.NET Core 双因素验证2FA 实战经验分享

必读本文源码核心逻辑使用AspNetCore.Totp,为什么不使用AspNetCore.Totp而是使用源码封装后面将会说明。为了防止不提供原网址的转载,特在这里加上原文链接:双因素认证双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起…

结合“性能监视器” 排查、处理性能瓶颈导致应用吞吐率等指标上不去的问题...

双11备战前夕,总绕不过性能压测环节,TPS 一直上不去 / 不达标,除了代码上的问题外,服务器环境、配置、网络、磁盘、CPU 亦是导致性能瓶颈的重要一环,本文旨在分享最近项目性能压测过程中的排查经验,文中的表…