C#学习☞接口

简介: 作为一个在学校学习C++, 出了校门想要找一份C++程序员的工作结果被公司要求搞C#工程的苦逼. 我终于走上了一条倚靠微软的不归路... 不过我对学东西是不排斥的. 所以买了本C#与.NET4高级程序设计开始入门.

作为一个在学校学习C++, 出了校门想要找一份C++程序员的工作结果被公司要求搞C#工程的苦逼. 我终于走上了一条倚靠微软的不归路...

不过我对学东西是不排斥的. 所以买了本C#与.NET4高级程序设计开始入门.

本来打算一天看100页, 8天内搞定语法部分, 然后投身WPF的. 谁知道客户各种翔一样的要求和突如其来的大量日语夜间培训课程让我的自由时间一下子从东北大馒头缩到了压缩饼干级别.

一周过去了, 我步履缓慢地来到了接口.

--------------华丽丽的分割线-----------------

昨晚上部门长从代理部门长升到了部门长, 请客去吃饭, 吃饭的时候有个朋友闹了个笑话. 因为鸟和蝙蝠都是会飞的, 所以他竟然把鸟也当成有雷达功能的了.

于是我想到一个问题: 鸟真的会飞吗?

首先, 创建一个类"鸟"

public class 鸟
{
    public string Name { get; set; }
    public virtual void Show() { Console.WriteLine("我是一只鸟"); }
}

接着, 创建"鸟"的子类, "乌鸦", "麻雀", "鸡"(有人说鸡不会飞不是鸟, 鸵鸟笑了), "鸵鸟"(于是他改口说鸡和鸵鸟都不是鸟, 好吧, 请找出他们的膀胱来)

class 乌鸦:鸟
{
    public override void Show() { Console.WriteLine("我是一只乌鸦"); }
    public void fly() { Console.WriteLine("我是一只乌鸦, 我能飞"); } }
class 鸽子 : 鸟 { public override void Show() { Console.WriteLine("我是一只鸽子"); }
    public void fly() { Console.WriteLine("我是一只鸽子, 我能飞"); } }
class 鸡 : 鸟 { public override void Show() { Console.WriteLine("我是一只鸡"); } } class 鸵鸟 : 鸟 { public override void Show() { Console.WriteLine("我是一只鸵鸟"); } }

于是我们有了五个类, 创建一个鸟的数组, 里面分别放入四个子类的对象.

鸟[] birds = new 鸟[] { new 乌鸦(), new 鸵鸟(), new 鸽子(), new 鸡()};

问题, 请问如何取得数组中所有会飞的鸟?

看上面的代码, 是有fly方法的就是会飞的, 那怎么判断一个类是否含有fly方法呢?

办法总是有的, 除了某种高深的能够判断类方法是否存在的方法外, 我们可以先把鸟类分成两类, 一类叫"会飞的鸟", 一类叫"不会飞的鸟".

没办法, 学校学的C++, 想出此种拙计...

可是, 问题拓展了, 因为并不只有鸟才会飞, 飞机也会飞, 蝙蝠也会飞. 新问题: 找出object数组中所有会飞的object.

肿么办?

反射是什么东西? 还没学到, 不清楚.

这个时候该引入接口了.

在C++学习的时候, 暴露给外界的接口就是大家共通的一个纯虚函数, 通常定义在一个由纯虚函数构成的类中, 叫做抽象类.

C#中不支持多个父类, 因为逻辑上程序员对OO的理解就是一棵大树, 树往下走可以有很多分支, 往上走, 只有一条路. 这个也符合生物学等等的门纲目科属的划分规则.

而对于多个类都能实现的动作, C#中就交给了接口去处理. 接口就相当于C++中一个由纯虚函数构成的抽象类. 我就这么去理解了.

定义一个Fly的接口

public interface IFly
{
    void Fly();
}

然后让上面的几个能飞的继承这个接口, 把fly方法改为Fly方法就可以了.

测试Main函数

static void Main(string[] args)
{
    鸟[] birds = new 鸟[] { new 乌鸦(), new 鸵鸟(), new 鸽子(), new 鸡()};

    foreach(鸟 bird in birds)
    {
        if (bird is IFly)
        {
            (bird as IFly).Fly();
        }
    }
    Console.ReadLine();
}

如果有其他的类也能飞的话, 只要继承IFly接口, 然后实现飞行Fly方法, 就能通过as或是is关键字判断出来了, 很方便不是.

当然也可以直接强转(IFly)bird, 不会fly的就会抛出一个InvalidCastException异常.

 

 

目录
相关文章
|
13天前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
32 2
|
19天前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
46 5
|
4月前
|
C#
C#的基本语法结构学习
【5月更文挑战第17天】C#基础语法包括变量(如`int x = 10`)、常量(`const int MAX_VALUE = 100`)、运算符(如算术和比较运算符)、控制语句(if、for、while等)和函数声明(`int Add(int x, int y) { return x + y; }`)。这些构成C#程序的基本元素。
62 0
|
1月前
|
API C# 数据库
SemanticKernel/C#:实现接口,接入本地嵌入模型
SemanticKernel/C#:实现接口,接入本地嵌入模型
51 1
|
1月前
|
C#
C# 面向对象编程(三)——接口/枚举类型/泛型
C# 面向对象编程(三)——接口/枚举类型/泛型
24 0
|
1月前
|
开发框架 .NET API
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
|
2月前
|
Dart 算法 JavaScript
C#数据结构与算法入门教程,值得收藏学习!
C#数据结构与算法入门教程,值得收藏学习!
|
3月前
|
前端开发 Java C#
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
|
4月前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
62 1
|
4月前
|
数据采集 数据可视化 搜索推荐
提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票
使用C#和Fizzler库,开发一个多线程爬虫,高效抓取五一假期特价机票信息。通过代理IP规避反爬策略,实现实时数据更新、个性化推送及数据可视化分析。示例代码展示如何配置代理、发送HTTP请求、解析HTML并提取机票详情。注意适应实际环境调整参数。祝编码愉快!
提升编码技能:学习如何使用 C# 和 Fizzler 获取特价机票