代码改变世界

解读经典《C#高级编程》继承 页107-113.章4

2019-02-22 18:10  圣殿骑士18  阅读(550)  评论(0编辑  收藏  举报

前言


本章节开始讲接口。

接口

接口的声明很像抽象类,有方法的声明但无方法体。但它比抽象类限制更多。和类比起来,接口的定义有众多限制。

  • 接口只能包含声明,而无方法体
  • 接口只能包含方法、属性、索引器、事件的声明。即不能有:构造函数、字段、操作符重载
  • 成员不允许声明修饰符。接口默认就是public的。

定义和实现接口

一个比较典型的接口定义,比如:

/// <summary>
/// 虚拟读写器
/// </summary>
public class VirtualReader : RFReader, IRFReader, IDevice
{
    //此类继承自两个接口:设备IDevice,和读写器IRFReader,并继承读写器基类RFReader
    //派生类 需要实现接口声明的所有方法
}

我们可以看到:

  1. 类可以继承多个接口
  2. 接口命名规范,是以I开头的字符串,即所谓匈牙利(Hungarian)命名法
    这是由C#语法的特殊性决定的,Java的接口就没有这种命名方式。这是因为C#对类和接口,都叫做继承,对接口加I能够明确区分出哪些是接口哪些是类。而Java继承用关键字extends,实现接口用关键字implements,很好区分。

在接口使用上,“接口引用”完全等同于“类引用”。比如以上的例子,在实例化类时,如下定义都是可以的:

IDevice device = new VirtualReader();
IRFReader reader = new VirtualReader();
VirtualReader vreader = new VirtualReader();

这样就可以在不同的应用场景下,声明不同的类或者接口来实现代码。

派生的接口

接口和类一样可以继承。同时,因为接口可以多继承,所以接口变的非常强大。在编程中用好接口是一个基本技能要求。
举例:

/// <summary>
/// 设备
/// </summary>
public interface IDevice
{
    /// <summary>
    /// 当前设备的属性配置
    /// </summary>
    DeviceConfigurations Configurations { get; set; }
}
/// <summary>
/// Rfid读写器/发卡器/读卡器/一体机等
/// </summary>
public interface IRFReader : IDevice
{
    /// <summary>
    /// 读写器类型Id
    /// </summary>
    ReaderType TypeId { get; set; }

    /// <summary>
    /// 读写器是否连接
    /// </summary>
    bool IsConnected { get; set; }

    /// <summary>
    /// 读写器是否正在读取
    /// </summary>
    bool IsReading { get; set; }
}

到此为止,本章的继承已经讲完了。我们讲到了对类的单继承,对接口的多继承。以及在继承过程中使用多种关键字,实现不同的特性,比如virtual,override,new,sealed等。还讲到了类构造时使用初始化器的原理。
下一章我们开始讲解泛型。泛型是个好东西,理解好、使用好泛型是个基础技术能力。


觉得文章有意义的话,请动动手指,分享给朋友一起来共同学习进步。
欢迎关注本人如下公众号 “产品技术知与行” ,打造全面的结构化知识库,包括原创文章、免费课程(C#,Java,Js)、技术专题、视野知识、源码下载等内容。

微信公众号
扫描二维码关注

回到目录,再看看相关文章