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