C# interface (接口)

定义

C# 语言中,类之间的继承关系仅支持单重继承,而接口是为了实现多重继承关系设计的。一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。无论是表示类之间的继承还是类实现接口、接口之间的继承,都使用“:”来表示。

接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。接口定义了语法合同 “是什么” 部分,派生类定义了语法合同 “怎么做” 部分。

定义接口语法:

interface 接口名称 { 接口成员; }

接口命名通常以 I 字母开头,例如Itest
接口成员,不允许使用 public、private、protected、internal 访问修饰符,不允许使用 static、virtual、abstract、sealed 修饰符。不能定义字段,定义的方法不能包含方法体。

示例:定义一本书的接口,有id、名称name、定价price几个属性,和一个方法售卖价SalePrice()

interface IBook { double SalePrice(int discount); }  

实现

接口的实现与类的继承语法格式类似,也是重写了接口中的方法,让其有了具体的实现内容。

实现接口语法:

class 类名 : 接口名 { //类中的成员以及实现接口中的成员 }

示例

class Book:IBook { public int Id { get; set; } public string Name { get; set; } public double Price { get; set; } public double SalePrice(int discount) { double salePrice = Price * discount * 0.1; return salePrice; } }

使用

class Program { static void Main(string[] args) { //实例化方式1 Book book = new Book(); //实例化方式2 IBook book1 = new Book(); } }

我们从官方教程中大都只了解到接口如何定义,如何实现,但是就是没讲它存在的意义是什么,今天我们就说一下什么场合适合使用哈

我们写代码不仅注重可用性,还更注重扩展性,当项目很复杂的时候,如果可扩展性和兼容性不强就会对以后的开发产生很大的阻力,接口其实就是为了实现面向对象思想中的多态而设计的,就拿人这个对象来说,世界上有黑人、白人、黄种人,男人、女人、好人、坏人等等,虽然都是人,但都有各自的特显,如果我们用一个类Person去表示,那这个类呢内容得多大呀,如果我们对每个对象都定义一个类,如下:

ZhongGuoPerson,RiBenPerson,MeiGuoPerson那这些类型虽然都是表示人,我们自己能理解,但是在编程中,他们是毫无关系的,假如我们有一个函数,其参数是接收一个表示人的类对象并计算出其身材是否标准,如下:

/// <summary> /// 中国人 /// </summary> class ZhongGuoPerson { /// <summary> /// 身高 /// </summary> public int ShenGao { get; set; } /// <summary> /// 体重 /// </summary> public int TiZhong { get; set; } } /// <summary> /// 日本人 /// </summary> class RiBenPerson { /// <summary> /// 身高 /// </summary> public int ShenGao { get; set; } /// <summary> /// 体重 /// </summary> public int TiZhong { get; set; } } /// <summary> /// 美国人 /// </summary> class MeiGuoPerson { /// <summary> /// 身高 /// </summary> public int ShenGao { get; set; } /// <summary> /// 体重 /// </summary> public int TiZhong { get; set; } } class Program { static void Main(string[] args) { ZhongGuoPerson p = new ZhongGuoPerson(); p.ShenGao = 180; p.TiZhong = 130; Console.WriteLine(CalcHeGe(p)); } /// <summary> /// 对于每一种人写个计算函数 /// </summary> /// <param name="p"></param> /// <returns></returns> static bool CalcHeGe(ZhongGuoPerson p) { return p.ShenGao > 170 && p.TiZhong > 120; } } }

如果换上接口:

interface IPerson { /// <summary> /// 身高 /// </summary> public int ShenGao { get; set; } /// <summary> /// 体重 /// </summary> public int TiZhong { get; set; } /// <summary> /// 国家 /// </summary> public string GuoJia { get; set; } } /// <summary> /// 中国人 /// </summary> class ZhongGuoPerson:IPerson { /// <summary> /// 身高 /// </summary> public int ShenGao { get; set; } /// <summary> /// 体重 /// </summary> public int TiZhong { get; set; } /// <summary> /// 国家 /// </summary> public string GuoJia { get; set; } } /// <summary> /// 日本人 /// </summary> class RiBenPerson:IPerson { /// <summary> /// 身高 /// </summary> public int ShenGao { get; set; } /// <summary> /// 体重 /// </summary> public int TiZhong { get; set; } /// <summary> /// 国家 /// </summary> public string GuoJia { get; set; } } /// <summary> /// 美国人 /// </summary> class MeiGuoGuoPerson:IPerson { /// <summary> /// 身高 /// </summary> public int ShenGao { get; set; } /// <summary> /// 体重 /// </summary> public int TiZhong { get; set; } /// <summary> /// 国家 /// </summary> public string GuoJia { get; set; } } class Program { static void Main(string[] args) { IPerson p = new ZhongGuoPerson(); p.ShenGao = 180; p.TiZhong = 130; p.GuoJia = "中国"; Console.WriteLine(CalcHeGe(p)); } /// <summary> /// 所有人只写这一个计算函数 /// </summary> /// <param name="p"></param> /// <returns></returns> static bool CalcHeGe(IPerson p) { if (p.GuoJia == "中国") { return p.ShenGao > 170 && p.TiZhong > 120; } else if (p.GuoJia == "日本") { return p.ShenGao > 160 && p.TiZhong > 100; } else { return p.ShenGao > 180 && p.TiZhong > 150; } } }

总结

从上面的例子可以看出,写代码还是需要悟性的,官方只给你说定义,如何使用,但要把代码写的好还是需要有悟性,在现有的语法规则下写出兼容性,扩展性强的代码,就像学习数学,大家都学的是加减乘除,为什么有的人能搞出微积分方程,而你只会简单的算术,高手不是那么容易练成的

鲸之声为您拼命加载中...