C# 接口
一、引言
接口接口,经常在项目里面说这个词,甚至在找工作面试的时候,面试官问:“项目之间是怎么协作的?” , 我答曰:“写好接口,模块分工,合并代码”。 其实我在瞎说,因为我根本没用到接口这个东西。只是类与类之间的互相调用。最近闲来无事,总结下接口。
接口在项目协同开发里面,作用是比较大的,最显著的一个作用就是 起到规范约束。接口定义了需要实现什么功能,具体的实现代码只能在派生类中完成。而且派生类必须全部实现接口所定义的所有功能。在开发之前,一个人写好接口,不做实现,然后其余人继承该接口,实现各自的功能模块,最后合并、调用的时候比较简单。否则你合并的时候会发现,我擦,这写的都是什么函数啊?函数名、参数都不一样!(各自有各自的编程水平、思想。因此写出来的成果在合并的人看来,比较杂乱,百花齐放啊)
官方介绍:
接口是一种为所有继承接口的类定义需要遵循的语法约定。接口定义了语法约定的“需要做什么”部分,派生类定义了语法约定的“如何实现”部分。
接口定义属性,方法和事件,它们是接口的成员。 接口只包含成员的声明。 派生类负责定义和实现成员。接口通常有助于为派生类提供遵循的标准结构。
抽象类在某种程度上起着相同的作用,但是,当基类只有少数方法声明并且由派生类实现时,才会考虑使用抽象类。
二、详解
接口定义
interface IEquatable<T> { bool Equals(T obj); }
-
接口可以包含方法、属性、事件、索引器,或者这四个成员类型的任意组合。
-
接口不提供实现,继承类负责实现全部功能。
-
若要实现接口成员,实现的选件类的相应成员必须是公共的,非静态的,并且具有名称和签名和接口成员相同。
-
派生类可以继承一个或者多个接口。
接口示例
借鉴下他们的动物叫的例子,介绍下 接口 的用法。(转)
动物接口
public interface IF_Animal { void Shout();//叫喊 }
狗狗类,继承接口,实现叫喊
class Dog : IF_Animal { public void Shout() { Console.WriteLine( "汪汪汪!"); } }
猫猫类,继承接口,实现叫喊
class Cat : IF_Animal { public void Shout() { Console.WriteLine("喵喵喵~"); } }
是时候实现百兽齐鸣了,哈哈哈
static void Main(string[] args) { List<IF_Animal> animals = new List<IF_Animal>(); IF_Animal dog = new Dog(); animals.Add(dog); IF_Animal cat = new Cat(); animals.Add(cat); foreach(IF_Animal e in animals) { e.Shout(); } }
继承多个接口
半兽人继承动物吼叫和人类讲话这2个接口。(增强版)
动物接口
public interface IF_Animal { void Shout();//叫喊 }
人类接口
public interface IF_People { void Say();//说话 }
半兽人继承上述2个接口
class Animal_People:IF_Animal,IF_People //继承多个接口,逗号隔开 { public void Shout() { Console.WriteLine("兽人吼叫:阿欧!"); } public void Say() { Console.WriteLine("人类说话:你好啊~"); } }
调用,是时候让半兽人说话了
Animal_People animal_People = new Animal_People(); animal_People.Say(); animal_People.Shout();
输出结果:
人类说话:你好啊~
兽人吼叫:阿欧!
接口的成员变量
接口:
interface Border { int W { get; set; } int H { get; set; } }
正方形继承接口:
class Square : Border { private int x, y; public int W { get { return x; } set { x = value; } } public int H { get { return y; } set { y = value; } } }
接口的使用:
Square b = new Square(); b.W = 2; b.H = 2;
接口的显示实现
定义2个接口
interface IControl //接口1 { void Paint(); } interface ISurface //接口 2 { void Paint(); }
SampleClass 继承2个接口
class SampleClass : IControl, ISurface { //void Paint();//如此隐式实现肯定容易出现歧义 void IControl.Paint() //显式实现 { System.Console.WriteLine("IControl.Paint"); } void ISurface.Paint()//显式实现 { System.Console.WriteLine("ISurface.Paint"); } }
调用接口
SampleClass sampleClass = new SampleClass(); // sampleClass.Paint(); 错误 IControl control = (IControl)sampleClass; control.Paint();
接口中的成员显式实现后,必须通过接口调用,而不能直接通过类进行调用
三、总结
抽象类:
- 一种不能实例化而必须从中继承的类,抽象类可以提供实现,也可以不提供实现
- 子类只能从一个抽象类继承
- 抽象类应主要用于关系密切的对象
- 如果要设计大的功能单元,则使用抽象类。
- 如果预计要创建组件的多个版本,则创建抽象类
接口:
- 是完全抽象的成员集合,不提供认识实现。
- 类或者结构可以继承几个接口。
- 接口最适合为不相关的类提供通用功能
- 如果要设计小而简练的功能块,则使用接口
四、引用
[1]C# 接口《通俗解释》https://www.cnblogs.com/hamburger/p/4681681.html--这个写的真是形象生动,特别适合新手看
[2]浅谈c#接口的问题,适合新手来了解https://www.cnblogs.com/zenkey/p/5753382.html--这个里面的百兽齐鸣让我笑了,推荐
[3]对C#中的接口使用和理解http://www.360doc.com/content/12/0320/03/3810344_195832587.shtml
[4]C# 接口的作用浅谈举例https://blog.csdn.net/liuqinghui1990/article/details/77171051--一个关于银行卡的接口例子