C# 抽象类小谈

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

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

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

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

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(实类)

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

时间: 2024-08-26 11:00:16

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

小谈VS使用技巧

引言 作为一名合格的程序员,常用的开发工具的熟练使用是我们必须掌握的.而作为一名优秀的程序员,我们不仅要能熟练的使用,而且还要去高效的使用.而作为.Net平台专门定制的开发工具VS那当然是我们必须要熟练掌握,而且还要去高效的使用的. VS是Visual Studio 的简称.VisualStudio是微软公司推出的开发环境.是最流行的Windows平台应用程序开发环境.功能非常的强大,现在已经更新到了V2013的版本.关于具体的VS介绍在这里就不赘述了,如果有感兴趣的朋友可以到网上自己查询.今天

[转载]小谈网络游戏同步

小谈网络游戏同步 同步在网络游戏中是非常重要的,它保证了每个玩家在屏幕上看到的东西大体是一样的.其实呢,解决同步问题的最简单的方法就是把每个玩家的动作都向其他玩家广播一遍,这里其实就存在两个问题:1,向哪些玩家广播,广播哪些消息.2,如果网络延迟怎么办.事实上呢,第一个问题是个非常简单的问题,不过之所以我提出这个问题来,是提醒大家在设计自己的消息结构的时候,需要把这个因素考虑进去.而对于第二个问题,则是一个挺麻烦的问题,大家可以来看这么个例子: 比如有一个玩家A向服务器发了条指令,说我现在在P1

小谈一下JavaScript中的JSON

一.JSON的语法可以表示以下三种类型的值: 1.简单值:字符串,数值,布尔值,null 比如:5,"你好",false,null JSON中字符串必须用双引号,而JS中则没有强制规定. 2.对象 比如: 1 { 2 "name":"蔡斌", 3 "age":21, 4 "isRich":false, 5 "school":{ 6 "name":"广东工业大

小谈学生团队管理

我是觉得我想创业的话,最好就是从校园开始.刚开始我只是认为,在学校创业,各种风险低,压力小:往后点觉得学校创业的最大优势是人力资源:后来发现,其实学校创业需要的其他资源也很充足.当然无论在哪创业,成功率都是居下不高,我们需要做的,是持久的规划and坚强地执行. 我本身并不属于管理控,但没办法,需要有人站出来,并且喊一句:"兄弟,我想这样这样,一起干怎么样?",然后拉起一小支队伍,为革命事业,为改变世界,抱团前进. 如何拉起学生团队 俗话说得好,"兵马未动,粮草先行"

小谈二分法 三分法

二分法,三分法主要是空间图形的不同,二分法主要解决的是在某个区间之间单调增或减的图形,而三分法主要解决的是凸形,或者凹形的图形,这样的用三分法比较方便些. 二分法模板, 整数类型的有以下大致模板: <span style="font-size:14px;">int low=0,high=n,mid,x,res=-1; while(low<high) { mid=(high+low)/2; if(num[mid]==x)//其中x是我们想要寻找的元素,num数组单调递增

理解互联网域名请求实现过程,以及Nodejs的http请求小谈

前提:在学习开发互联网网站程序前,需要了解知道一个客户端请求,如何能展现成一个炫丽的网页的. 一.域名请求实现 这幅图足以说明一个域名请求的过程了吧 二.服务器端的处理(Nodejs示例) 直接上nodejs代码 1 var http = require('http'); 2 3 http.createServer(function(req, res) { 4 if (req.method === 'GET') { 5 var html; 6 switch (req.url) { 7 case

【转载】小谈导数、梯度和极值

小谈导数.梯度和极值 [转载请注明出处] http://www.cnblogs.com/jerrylead 记得在高中做数学题时,经常要求曲线的切线.见到形如之类的函数,不管三七二十一直接求导得到,这就是切线的斜率,然后就得到了处的切线. 上大学又学习了曲面切线和法向量的求法,求偏导是法向量,然后套公式求出切线. 一个经典例子如下: (来自web上某个<几何应用>ppt) 其中的向量n是F(x,y,z)的偏导数. 然而,这两者求法看似无关啊,中求得的是切线,然而下面的求偏导后却是法向量,为啥都

小谈边界问题

边界问题主要有两种,动态关系的,还有就是静态关系的. 第一类是有一定对称性的几何图形,比如说打印倒三角形或者菱形等.这种题目一般思路就是找出图形的特点(对称性等)与循环变量(行号,列号)之间的关系. 我们可以假设行用i表示,列用j表示.我们的目的就是找出i,j与图形之间的对应关系.按图形形状的不同,复杂性不同.但是都可以看做是在寻找一种或多种"静态关系". 这类题主要有打印三角形,代码如下: #include<stdio.h> #include<string.h>

小谈学习方法(学习篇)

读了这么多年的书,虽没有特别的成就,但也该多总结自己的学习方法吧.这里谈的学习方法,主要还是指理科方面,不拘束于哪个年龄阶段.当然,在学习方法方面,是因人而异的,不是说我的方法就适合你,同时我也不是什么大牛或者学霸,纯属自己的一些学习心得,希望可以和大家多多交流. 首先,先说说智商的话题吧,不知道你想不相信智商,但我相信很多人都是相信的,包括我,也是相信智商压制的.智商这东西是存在的,不然还要科学家干什么对吧?举个例子,即使把一亿人关在小屋子想100年,也是想不出爱因斯坦的相对论的,也造不出原子