摘要
接口定义了所有类继承接口时应遵循的语法约定。接口定义了语法约定 "是什么" 部分,派生类定义了语法约定 "怎么做" 部分。
正文
接口定义了属性、 *** 和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。抽象类在某种程度上与接口类似,但是,它们大多是由基类的派生类。
1.接口本身并不实现任何功能。
2.抽象类不能直接实例化。
定义接口语法:
接口命名通常以 I 字母开头,例如IAction。
public interface IAction { bool Start(); bool Stop(); }
接口成员,不允许使用 public、private、protected、internal 访问修饰符,不允许使用 static、virtual、abstract、sealed 修饰符。不能定义字段,定义的 *** 不能包含 *** 体。
定义一个Material 接品
public interface IMaterial { string Name { get; set; } string Mlfb { get; set; } bool Start(); bool Stop(); }
实现
接口的实现与类的继承语法格式类似,就是重写了接口中的 *** 。
定义一个Plc类,继承了接口
internal class Plc : IMaterial { public string Name { get; set; } public string Mlfb { get; set; } public bool Start() { Console.WriteLine($"{this.Name} Start"); return true; } public bool Stop() { Console.WriteLine($"{this.Name} Stop"); return true; } }
调用
//通过类声明 Equipment equipment=new Equipment(); equipment.Name = "S7-1200"; equipment.Start(); equipment.Stop(); //通过接口声明 IMaterial equipment1 = new Equipment(); equipment1 .Name = "S7-1500"; equipment1 .Start(); equipment1 .Stop();
多态
使用接口实现多态 需要满足以下两个条件。
定义接口并使用类实现了接口中的成员。
创建接口的实例指向不同的实现类对象。
再定义一个Motor类,同样继承IMaterial接口
internal class Motor : IMaterial { public string Name { get; set; } public string Mlfb { get; set; } public bool Start() { Console.WriteLine($"{this.Name} Start"); return true; } public bool Stop() { Console.WriteLine($"{this.Name} Stop"); return true; } }
调用
//通过接口声明 IMaterial material1 = new Plc(); material1.Name = "S7-1500"; material1.Start(); material1.Stop(); //通过接口声明 IMaterial material2 = new Motor(); material2.Name = "S120"; material2.Start(); material2.Stop();
修改Plc类,将两个 *** 设置成virtual
internal class Plc : IMaterial { public string Name { get; set; } public string Mlfb { get; set; } //申明成虚 *** public virtual bool Start() { Console.WriteLine($"{this.Name} Start"); return true; } public virtual bool Stop() { Console.WriteLine($"{this.Name} Stop"); return true; } }
再声明一个S71200类
internal class S71200 : Plc { public override bool Start() { Console.WriteLine("我是1200,运行中..."); return true; } }
同样通过接口声明实例化
//通过接口声明 IMaterial material3 =new S71200(); material3.Name = "1217"; material3.Start(); material3.Stop();
抽像类与接口区别
抽象类可以有实例成员,接口则不能。抽象类不能多继承,接口还是可以的。抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。此外接口不能包含字段、构造函数、析构函数、静态成员或常量。(在新的版本中已经不是绝对的了,C# 8.0后可以用static成员了)