『7x24小时有问必答』
           本文结合工控场景讲解 C# 面向对象的核心概念(类 / 封装 / 继承 / 多态),并重点演示工业场景下的类设计(设备类、通信类),我会从工控实际应用出发,把抽象的面向对象概念落地到具体的工业编程场景中。

一、面向对象核心概念(工控视角解读)

先把四大核心概念翻译成工控工程师能理解的语言,再结合代码实现:
核心概念
工控视角解读
类比(工控场景)
类(Class)
设备 / 功能的 “模板”,定义设备有哪些属性(参数)和行为(方法)
PLC 的功能块(FB)、设备的技术手册(规定了参数和操作)
封装(Encapsulation)
隐藏设备内部细节,只暴露必要的操作接口,防止误操作
设备的操作面板(只给按钮 / 显示屏,内部电路不可见)
继承(Inheritance)
复用同类设备的通用属性 / 方法,只扩展特有功能
所有电机都有转速 / 启停(通用),伺服电机多了定位功能(特有)
多态(Polymorphism)
同一操作对不同设备有不同实现,适配多样化设备
同样是 “启动” 操作,电机启动是转起来,阀门启动是打开

---

二、核心概念实战(工控场景代码实现)

1. 类(Class)—— 定义工业设备模板

核心逻辑:把工业设备的属性(参数)和行为(操作)封装成类,比如 “工业设备基类” 包含所有设备通用的属性(编号、状态)和方法(启停)。
using  System;// 工业设备基类(所有工业设备的通用模板)public  class  IndustrialDevice{       // 通用属性(设备编号、运行状态、累计运行时长)       public  string  DeviceId {  get;  set; }  // 设备编号       public  byte  Status {  get;  set; }      // 状态:0=停止,1=运行,2=故障       public  int  RunHours {  get;  set; }     // 累计运行时长(小时)       // 通用方法(启动、停止)       public  virtual  void  Start()  // virtual标记为可被重写(为多态做准备)      {             if  (Status ==  2)            {                  Console.WriteLine($"【{DeviceId}】设备故障,无法启动!");                   return;            }            Status =  1;            Console.WriteLine($"【{DeviceId}】设备启动成功!");      }       public  virtual  void  Stop()      {            Status =  0;            Console.WriteLine($"【{DeviceId}】设备停止成功!");      }       // 显示设备状态(通用方法)       public  void  ShowStatus()      {             string  statusDesc = Status  switch            {                   0  =>  "停止",                   1  =>  "运行",                   2  =>  "故障",                  _ =>  "未知"            };            Console.WriteLine($"=== 设备【{DeviceId}】状态 ===");            Console.WriteLine($"运行状态:{statusDesc}");            Console.WriteLine($"累计运行时长:{RunHours}  小时");      }}

2. 封装(Encapsulation)—— 保护设备核心参数

核心逻辑:对关键参数(如电机额定转速)做私有封装,只通过方法 / 属性控制读写,防止非法赋值(比如转速超过额定值)。
// 电机类(继承自工业设备基类,增加封装特性)public  class  Motor  :  IndustrialDevice{       // 私有核心参数(封装,外部不可直接修改)       private  float  _ratedSpeed;  // 额定转速(r/min)       private  float  _currentSpeed;  // 当前转速       // 公共属性(控制读写权限,加入校验逻辑)       public  float  RatedSpeed      {             get  => _ratedSpeed;  // 只读,外部可获取但不可修改             init  => _ratedSpeed =  value  >  0  ?  value  :  throw  new  ArgumentException("额定转速必须大于0!");      }       public  float  CurrentSpeed      {             get  => _currentSpeed;             set            {                   // 封装核心逻辑:转速不能超过额定值,不能为负                   if  (value  <  0)                        _currentSpeed =  0;                   else  if  (value  > _ratedSpeed)                  {                        _currentSpeed = _ratedSpeed;                        Console.WriteLine($"【{DeviceId}】转速超限,自动降至额定转速{_ratedSpeed}r/min");                  }                   else                        _currentSpeed =  value;            }      }       // 构造函数(初始化设备)       public  Motor(string  deviceId,  float  ratedSpeed)      {            DeviceId = deviceId;            RatedSpeed = ratedSpeed;            Status =  0;  // 初始状态:停止            RunHours =  0;            _currentSpeed =  0;      }}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码