网站首页 > 技术文章 正文
摘要
接口定义了所有类继承接口时应遵循的语法约定。接口定义了语法约定 "是什么" 部分,派生类定义了语法约定 "怎么做" 部分。
正文
接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。抽象类在某种程度上与接口类似,但是,它们大多是由基类的派生类。
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(#34;{this.Name} Start");
return true;
}
public bool Stop()
{
Console.WriteLine(#34;{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(#34;{this.Name} Start");
return true;
}
public bool Stop()
{
Console.WriteLine(#34;{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(#34;{this.Name} Start");
return true;
}
public virtual bool Stop()
{
Console.WriteLine(#34;{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成员了)
猜你喜欢
- 2025-07-24 Channels: C# 实现高效的线程间通信
- 2025-07-24 一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试
- 2025-07-24 C# 获取Windows的系统信息(c# 获取本机的ip地址)
- 2025-07-24 C# 读取本地网络配置信息(c# 读取配置文件的方法)
- 2025-07-24 MODBUS协议在C#中的应用案例(c#modbus 程序)
- 2025-07-24 C#接口(c接口镜头)
- 2025-07-24 AngleSharp :在 C# 中轻松解析和操作 HTML/XML 文档
- 2025-07-24 C#中的9个“黑魔法”与“骚操作”
- 2025-07-24 C#.NET Ninject 详解(c#.net framework)
- 2025-07-24 C#.NET HttpClient 使用教程(c#开启http服务)
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)