最近在做一个测试系统,就是读取功率计上的数据,在上位机软件上显示出来。

电脑界面不是我们这次的主讲就略过,我们这里主要讲一个类的实现。

最开始领导给了一个 远方的三相功率计 给我让我写上位机,很简单,我一会就实现出来了。

由于是三相功率计,所以我们先写个一相的基类出来

public class OnePhase
{
public float V { get; set; }
public float A { get; set; }
public float W { get; set; }
public float VA { get; set; }
public float PF { get; set; }
}

远方的类

 public class PF9830
{
public PF9830()
{
P1 = new OnePhase();
P2 = new OnePhase();
P3 = new OnePhase();
P4 = new OnePhase();
} public OnePhase P1 { get; set; }
public OnePhase P2 { get; set; }
public OnePhase P3 { get; set; }
public OnePhase P4 { get; set; } public void GetValues(byte[] data)
{
/*
* 串口读取值的解释
*
* P1.V = ……
*/
}
}

实现类

class Test
{
public Test()
{
PowerMeter = new PF9830(); Port = new SerialPort();
Port.DataReceived += new SerialDataReceivedEventHandler(Port_DataReceived);
} public PF9830 PowerMeter { get; set; } public SerialPort Port { get; set; } void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int length = Port.BytesToRead;
byte[] data = new byte[length];
Port.Read(data, 0, length);
PowerMeter.GetValues(data);
}
}

工作很快就完成了,也正常运行。可是有一天,领导说远方的测试精度太差了,要换一个横河的功率计进行测试,最好有一个下拉列表,可以选择是哪个仪器。
我刚开始的时候直接再写一个横河的类出来,如下:

public class WT230
{
public WT230()
{
P1 = new OnePhase();
P2 = new OnePhase();
P3 = new OnePhase();
P4 = new OnePhase();
} public OnePhase P1 { get; set; }
public OnePhase P2 { get; set; }
public OnePhase P3 { get; set; }
public OnePhase P4 { get; set; } public void GetValues(byte[] data)
{
/*
* 串口读取值的解释
*
* P1.V = ……
*/
}
}
class Test
{
public enum Powermeters { 远方, 横河 }; public Test()
{
PowerMeter1 = new PF9830();
PowerMeter2 = new WT230();
Port = new SerialPort();
Port.DataReceived += new SerialDataReceivedEventHandler(Port_DataReceived);
} public PF9830 PowerMeter1 { get; set; } public WT230 PowerMeter2 { get; set; } public SerialPort Port { get; set; } private Powermeters flag; void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int length = Port.BytesToRead;
byte[] data = new byte[length];
Port.Read(data, 0, length);
switch (flag)
{
case Powermeters.横河:
PowerMeter2.GetValues(data);
break;
case Powermeters.远方:
PowerMeter1.GetValues(data);
break;
default:
break;
}
}
}

这里我们会发现WT230与PF9830两个类中有很多相同的代码,只是GetValues()这个方法不现。
再的就是实现类的有两个实例PowerMeter1与PowerMeter2,这与UI交互方面会存在很大的问题。

这里我们如果运用抽象类就可以很容易的解决上面的两个问题

首先我们先抽象出一个 功率计 的类出来:

 public abstract class PowerMeterBase
{
public PowerMeterBase()
{
P1 = new OnePhase();
P2 = new OnePhase();
P3 = new OnePhase();
P4 = new OnePhase();
} public OnePhase P1 { get; set; }
public OnePhase P2 { get; set; }
public OnePhase P3 { get; set; }
public OnePhase P4 { get; set; } public abstract void GetValues(byte[] data);//抽象方法
}

然后实例远方与横河的类

 public class PF9830:PowerMeterBase
{
public override void GetValues(byte[] data)
{
/*
* 串口读取值的解释
*
* P1.V = ……
*/
}
}
public class WT230:PowerMeterBase
{
public override void GetValues(byte[] data)
{
/*
* 串口读取值的解释
*
* P1.V = ……
*/
}
}

现在我们实现的UI交互类就简单多了

class Test
{
public enum Powermeters { 远方, 横河 }; public Test()
{
Port = new SerialPort();
Port.DataReceived += new SerialDataReceivedEventHandler(Port_DataReceived);
} public PowerMeterBase PowerMeter { get; set; } //实现多态 public SerialPort Port { get; set; } private Powermeters flag; void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int length = Port.BytesToRead;
byte[] data = new byte[length];
Port.Read(data, 0, length);
switch (flag)
{
case Powermeters.横河:
PowerMeter = new WT230();
PowerMeter.GetValues(data);
break;
case Powermeters.远方:
PowerMeter = new PF9830();
PowerMeter.GetValues(data);
break;
default:
break;
}
}
}

总结:

  功率计(抽象类)WT230(实类)PF9830(实类)

  对不同功率计的显示(多态)

C# 抽象类小谈的更多相关文章

  1. DevStore开发人员服务有奖征文:小谈新浪微博开放平台

    DevStore开发人员服务有奖征文:小谈新浪微博开放平台 笔者接入新浪微博开发平台也有一段时间了,对整个平台的接入也算比較熟悉,新浪提供了统一的API接口,能够让开发人员更方便的使用API来实现自己 ...

  2. 小谈Java里的线程

    今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...

  3. 小谈@override

    @override是jdk1.5增加的注解,主要是用来声明子类的某方法覆盖了父类的某方法.非常简单的注解,但是有个小问题: 项目最开始使用的是jdk1.6,mvc模式:接口 ----> 实现类. ...

  4. 小谈Scrum敏捷开发流程

    一晃眼,有两年没有写博客了,回顾前两年,各种奔波,各种忙碌,也有不少的收获.从今天开始,我要把这些收获都分享在这里. 其实这两年,对我影响最大的是开发流程.总所周知,一个好的开发流程,对于项目的进行, ...

  5. iOS 小谈开发者中的个人、组织(公司、企业)账号

    苹果对开发者主要分为3类:个人.组织(公司.企业).教育机构.即: 1.个人(Individual) 2.组织(Organizations) 组织类又分为2个小类: (1)公司(Company) (2 ...

  6. Http与Socket小谈

    http与socket是网络编程中最为重要的概念,不管是客户端还是服务端,都是最为重要的部分,以下简述两者的关系和区别(个人见解). Http 定义 基于应用层的超文本传输协议.通常承载于TCP/IP ...

  7. 小谈 - web模仿手机打电话与正则表达式

    昨天遇到了一个很棘手的问题,就是手机端调用web端的页面,如果用编辑器插入的内容页面中有电话的的数据就要变一下格式,让手机端可以实现拨号的功能. 研究了半天就是没一点头绪,但是偶尔看到数据中每一个电话 ...

  8. 小谈React、React Native、React Web

    React有三个东西,React JS 前端Web框架,React Native 移动终端Hybrid框架,React Web是一个源码转换工具(React Native 转 Web,并之所以特别提出 ...

  9. scales小谈grunt

    Grunt是基于Node.js的项目构建工具.它可以自动运行你所设定的任务.Grunt拥有数量庞大的插件,几乎任何你所要做的事情都可以用Grunt实现. 一头野猪映入眼帘,意:咕噜声 中文网站:htt ...

  10. PHP 小谈静态用法

    1.静态的表现形式,在PHP中定义一个静态变量需要加入一个关键字——static,静态对象是属于类的,非静态对象是属于对象的 class Fenbi { public $changdu;//属于对象的 ...

随机推荐

  1. Apinto 网关 V0.11.1 版本发布,多协议互转,新增编码转换器,接入 Prometheus...

    憋了那么久,Eolink 旗下 Apinto 开源网关再次更新啦~ 一起来看看是否有你期待的功能! 1.协议转换功能上线 之前发布的 Apinto v0.10.0 已经支持了多协议的基本功能,实现多协 ...

  2. 如何设置VBA代码的密码?如何取消VBA代码的密码?

    经常有网友问,用Access把软件开发好了,怎么样设置VBA代码的密码?以保护自己的代码不被同事修改.这里简单整理了一下.设置VBA代码的密码及取消VBA代码的密码步骤如下:1.打开任意一个窗体,进入 ...

  3. 排查问题-输出pojo日志,尽量用json

    背景: 下午在做一个前后端md5加密签名校验. 前端用参数A,B,C,经过MD5加密函数,得到签名D. 然后前端带着ABCD一块来到后端. 同样的,后端拿到请求后,用MD5函数对ABC进行加密,得到签 ...

  4. SAP SMARTFORMS World格式白屏

    解决方法: SE38 RSCPSETEDITOR 不勾选SAP script 和智能表

  5. 微信APP支付后台配置

    1.申请商户号 ,申请成功后去配置证书APIv2 https://pay.weixin.qq.com/index.php/core/cert/api_cert#/    --MchKey  和MchI ...

  6. vue增强第三方UI库(element-ui)

    vue增强第三方UI库(element-ui) 目前笔者了解有以下思路拓展第三方ui库,此系列以element-ui作为例子 指令. 混入. 二次封装. fork一份element-ui仓库,修改代码 ...

  7. ubuntu docker pull 失败 Error response from daemon: Get https://registry-1.docker.io/v2/

    问题: ubuntu@VM-3-4-ubuntu:~$ docker pull tensorflow/tensorflow:2.3.4-gpuError response from daemon: G ...

  8. vue跨行跨列动态表格生成

    一.思路步骤: 根据后台传输的数据进行格式转化: 索引为多少的时候进行跨行: <table id="table"> <thead> <tr> & ...

  9. 【Linux】docker学习

    docker 使用加速器可以提升获取Docker官方镜像的速度 方法: 安装/升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端,参考文档 docker-ce 配置镜像加速器 针 ...

  10. 查看nohup.out 日志文件

    1.查看实时日志: tail -f nohup.out 2.查看实时日志并检索关键字: tail -f nohup.out | grep "关键字" 3.查看文件最后100行日志: ...