程序设计选择接口还是选择基类?那个更适合。

接口VS基类,应该如何选择哪?

首先判断类之间关系(业务关系),代码重用性,接口与基类区别,代码是否可重编译。

1、类之间关系 如是is_a 关系的那选择基类,如苹果属于水果类吗 ? 是的 那应选择基类方式来已继承方式。

2、代码重用性,如果各个类中有重复方法过程,那就最好选择基类继承方式来减少重复代码复制。

3、接口与基类,继承区别:子类只能继承一个基类,但可以实现多个接口

4、接口如有修改变化那实现子类将会强迫实现接口中的变化,而基类方式不一定要强迫子类去修改,可不重新编译源代码。

实例代码如下:

    

/// <summary>
    /// 激光雷达数据解析基类
    /// </summary>
    public abstract class  ReadLidarDataBase
    {

        /// <summary>
        /// 文件存放路径
        /// </summary>
        public string FilsPath { get; set; }

        /// <summary>
        /// 最小数据高度(千米)
        /// </summary>
        public double MinDataHeight { get; set; }
        /// <summary>
        /// 最大数据度度(千米)
        /// </summary>
       public double MaxDataHeight { get; set; }

        /// <summary>
        /// 查询结果类型
        /// </summary>
        public  RadarDataType RadarType { get; set; }

        /// <summary>
        /// 查询时间
        /// </summary>
        public DateTime QueryTime { get; set; }

        /// <summary>
        /// 解析后数据列表
        /// </summary>
        public List<LidarDataItem> _radarbaselist = new List<LidarDataItem>();


        /// <summary>
        /// 错误信息
        /// </summary>
        public string ErorStr { get; set; }

        /// <summary>
        /// Char 数据中的最大值(正常取数据数据列表中最大值)
        /// </summary>
        public double CharvisualMap_MaxValues { get; set; }
        /// <summary>
        /// 加载数据 
        /// </summary>
        /// <param name="filspath"></param>
        /// <param name="radartype"></param>
        /// <param name="queryTime"></param>
        public  virtual void LoadData(string filspath, RadarDataType radartype, DateTime queryTime)
        {
            FilsPath = filspath;
            RadarType = radartype;
            QueryTime = queryTime;
             
        }

        /// <summary>
        /// 前台显示EChar结果 
        /// </summary>
        /// <returns></returns>
        public virtual string RadarCharts()
        {
            try
            {
                StringBuilder sbxdata = new StringBuilder();
                sbxdata.Append("[ ");
                StringBuilder sbydata = new StringBuilder();
                sbydata.Append("[ ");
                StringBuilder sbdata = new StringBuilder();
                sbdata.Append("[ ");
                List<double> whereheight = new List<double>();

                var hlist = from s in _radarbaselist
                            where whereheight.Contains(s.Height)
                            select s;
                var querywhereheight = _radarbaselist.Where(p => p.Height <= MaxDataHeight && p.Height >= MinDataHeight);

                var query = querywhereheight.GroupBy(p => p.DataTime);

                List<double> queryHeight = querywhereheight.Select(p => p.Height).Distinct().ToList();
                double maxvalues = 0;
                if (CharvisualMap_MaxValues == 0)
                {
                    maxvalues = Math.Ceiling(querywhereheight.Max(p => p.Valeu));

                }
                else
                {
                    maxvalues = CharvisualMap_MaxValues;
                }
                queryHeight.Sort();
                int x = 0;
                int y = 0;
                foreach (var itemtime in query)
                {
                    DateTime dt = itemtime.Key;
                    if (x == 0)
                    { sbxdata.Append("'" + dt.ToString("dd日HH时mm分") + "'"); }
                    else
                    { sbxdata.Append(",'" + dt.ToString("dd日HH时mm分") + "'"); }
                    var hlistitme = itemtime.OrderBy(p => p.Height);
                    y = 0;
                    foreach (var item in hlistitme)
                    {
                        sbdata.Append("[" + x + "," + y + "," + item.Valeu + "],");
                        y++;
                    }
                    x++;
                }
                sbxdata.Append(" ]");
                var data = sbdata.ToString();
                if (data.Length > 0)
                {

                    data = data.Remove(data.Length - 1, 1);
                }
                data = data + " ]";
                //Ydata
                for (int i = 0; i < queryHeight.Count; i++)
                {
                    if (i == 0)
                    {
                        sbydata.Append(queryHeight[i]);
                    }
                    else
                    {
                        sbydata.Append("," + queryHeight[i]);
                    }
                }
                sbydata.Append("]");
                // end Ydata
                string result = "";
                StringBuilder sb = new StringBuilder();
                sb.Append("  {");
                sb.Append("tooltip: {");
                sb.Append("          },");
                sb.Append(" grid: {");
                //sb.Append("    right: 10,");
                sb.Append("    bottom : 10,");
                sb.Append("     left: '50'");
                sb.Append(" },");
                sb.Append(" title: {");
                sb.Append("text: '" + this.QueryTime.ToString("yyyy年MM月dd日HH点  ") + RadarDataTypeNamecs.GetRadarDataTypeName(this.RadarType) + "',");
                sb.Append("top: 20,");
                sb.Append("left: 'center'");
                sb.Append(" },");
                sb.Append("  xAxis: {");
                sb.Append("     type: 'category',"); // splitNumber:10
                sb.Append("     splitNumber:80,"); // splitNumber:10
                sb.Append("   data: " + sbxdata.ToString());
                sb.Append("},");
                sb.Append(" yAxis: {");
                sb.Append("   name: '高度(km)',");
                sb.Append("   nameLocation: 'middle',");
                sb.Append("   nameGap: 60,");
                sb.Append("   type: 'category',");
                sb.Append("   data: " + sbydata.ToString());
                sb.Append("},");
                sb.Append("  visualMap: {");
                // sb.Append("  type: 'piecewise',");
                sb.Append("     min: 0,");
                sb.Append("  max: " + maxvalues + ",");
                sb.Append("  calculable: true,");
                sb.Append("  realtime: false, ");
                sb.Append("  x: 'right',");
                // sb.Append("    splitNumber: 6,");   
                sb.Append("    inRange: {");
                sb.Append("        color: [ '#0066FF', '#00FF99',  '#FFFF00', '#FF0000', '#FF0000', '#FF0000']");
                sb.Append("     }");
                sb.Append("  },");
                sb.Append(" series: [{");
                sb.Append("     name: '值',");
                sb.Append("      type: 'heatmap',");
                sb.Append("      data: " + data + ",");
                sb.Append("      itemStyle: {");
                sb.Append("          emphasis: {");
                sb.Append("              borderColor: '#333',");
                sb.Append("              borderWidth: 1");
                sb.Append("          }");
                sb.Append("      },");
                sb.Append("       progressive: 1000,");
                sb.Append("       animation: false");
                sb.Append("    }]");
                sb.Append("};");
                result = sb.ToString();
                return result;
            }
            catch (Exception ex)
            {

                return "";
            }
        }

    }
子类 1:
 public class LidarData_ZKGD : ReadLidarDataBase
    {

        List<DateTime> _listDatatime = new List<DateTime>();
        
        public LidarData_ZKGD()
        {
            MinDataHeight = 0.2;
            MaxDataHeight = 5.01;
        }

        /// <summary>
        /// 加载数据
        /// </summary>
        public override void LoadData(string filspath, RadarDataType radartype, DateTime queryTime)
        {
            base.LoadData(filspath, radartype, queryTime);
            string datapath = FilsPath + @"//" + RadarType.ToString() + "_" + QueryTime.ToString("yyyyMMddHH") + ".txt";
            if (!File.Exists(datapath))
            {
                ErorStr = "文件不存在";
                return;
            }
            using (StreamReader fs = new StreamReader(datapath))
            {
                string linestri = "";
                int row = 0;
                while ((linestri = fs.ReadLine()) != null)
                {
                    if (row == 0) //头
                    {
                        ResolveHeadData(linestri);
                    }
                    else
                    {
                        double dataheight = 0;
                        var rowllist = ResolveRowData(RadarType, linestri, ref dataheight);
                        if (dataheight >= MinDataHeight && dataheight <= MaxDataHeight)
                        {
                            _radarbaselist.AddRange(rowllist);
                        }
                    }
                    row++;
                }
            }
            if (_radarbaselist.Count == 0)
            {

                ErorStr = "数据为空";

            }
            //测试代码
            //string datapath2 = FilsPath + @"//" + "vag_" + QueryTime.ToString("yyyyMMddHH") + ".txt";
            //using (StreamWriter sr = File.CreateText(datapath2))
            //{
            //    foreach (var item in _radarbaselist)
            //    {
            //        string s = item.DataTime + " " + item.Height + " " + item.Valeu;
            //        sr.WriteLine(s);
            //    }
            //}
        }

      
        /// <summary>
        /// 解析头数据
        /// </summary>
        /// <param name="headstr"></param>
        /// <returns></returns>
        bool ResolveHeadData(string headstr)
        {
            string[] arrstr = headstr.Split(',');
            if (arrstr.Length < 2) //空数据
            {
                return false;
            }
            else
            {
                //从第二数据开始
                for (int i = 1; i < arrstr.Length; i++)
                {
                    string dt = arrstr[i];
                    if (dt.Length > 0)
                    {
                        DateTime dtime;
                        if (DateTime.TryParse(dt, out dtime))
                        {
                            _listDatatime.Add(dtime);
                        }
                        else
                        {
                            return false;
                        }
                    }

                }
                return true;
            }
        }

        /// <summary>
        /// 解析行数据
        /// </summary>
        /// <param name="headstr"></param>
        /// <returns></returns>
        List<LidarDataItem> ResolveRowData(RadarDataType datatype, string datarowstr, ref double height)
        {
            List<LidarDataItem> listdatarows = new List<LidarDataItem>();
            string[] arrstr = datarowstr.Split(',');
            if (arrstr.Length == 0) //空数据
            {
                return null;
            }
            else if (arrstr.Length - 2 != _listDatatime.Count)
            {
                return null;
            }
            else
            {
                //高度
                height = double.Parse(arrstr[0]);
                //从第二数据开始
                for (int i = 1; i < arrstr.Length; i++)
                {
                    if (arrstr[i].Length > 0)
                    {
                        DateTime datatime = _listDatatime[i - 1];
                        string dt = arrstr[i];
                        double values;
                        if (double.TryParse(dt, out values))
                        {
                            ///Console.WriteLine("datatime={0},height={1},valel={2}", datatime, height, values);
                            listdatarows.Add(new LidarDataItem() { DataTime = datatime, DataType = datatype, Height = height, Valeu = values });
                        }
                        else
                        {
                            return null;
                        }
                    }
                }

            }
            return listdatarows;
        }

      


    }
子类2:

public class LidarData_LD : ReadLidarDataBase
    {
        public LidarData_LD()
        {
            MinDataHeight = 0.1;
            MaxDataHeight = 3.1;
            CharvisualMap_MaxValues = 2;
        }

        /// <summary>
        /// 加载数据 
        /// </summary>
        public override void LoadData(string filspath, RadarDataType radartype, DateTime queryTime )
        {
            base.LoadData(filspath, radartype, queryTime);
            LoadData();
        }

        void LoadData()
        {
            var filepathlist = LoadDataFileName();
            foreach (var item in filepathlist)
            {
                using (StreamReader fs = new StreamReader(item))
                {
                    string linestri = "";
                    int row = 0;
                    LidarDataItem HeadData = new LidarDataItem();
                    double bgheight = 15; //15米  
                    while ((linestri = fs.ReadLine()) != null)
                    {
                        if (row == 0) //头
                        {
                            ResolveHeadData(linestri, ref HeadData);
                        }
                        else if (row >= 7)
                        {
                            double dataheight = 0;
                            var datarow = ResolveRowData(RadarType, linestri, HeadData, bgheight);
                            //if (dataheight >= MinDataHeight && dataheight <= MaxDataHeight)
                            {
                                _radarbaselist.Add(datarow);
                            }
                            bgheight += 15;
                        }
                        row++;
                    }
                }
                if (_radarbaselist.Count == 0)
                {

                    ErorStr = "数据为空";

                }

            }

            测试代码
            //string datapath2 = FilsPath + @"//" + "vag_" + QueryTime.ToString("yyyyMMddHH") + ".txt";
            //using (StreamWriter sr = File.CreateText(datapath2))
            //{
            //    foreach (var item in _radarbaselist)
            //    {
            //        string s = item.DataTime + " " + item.Height + " " + item.Valeu;
            //        sr.WriteLine(s);
            //    }
            //}
        }

        /// <summary>
        /// 加载数据文件 
        /// 如:2017-10-10 08:00数据,开始时间是2017-10-9 08:00 到2017-10-10 08:00文件
        /// </summary>
        /// <returns></returns>
         List<string> LoadDataFileName()
        {
            List<string> FilePathList = new List<string>();

            //开始时间  QueryTime 
            DateTime bgtime = QueryTime.AddDays(-1);
            DateTime endtime = QueryTime;
            while (bgtime <= endtime)
            {
                string datapath = FilsPath + bgtime.ToString("yyyyMM") + "\\";
                string getfilename = "HF" + bgtime.ToString("yyyyMMddHH");///HF2017112408
                DirectoryInfo dataDir = new DirectoryInfo(datapath);
                if (dataDir.Exists)
                {
                    foreach (var item in dataDir.GetFiles())
                    {
                        string filename = item.Name;
                        string filenametime = filename.Split('.')[0];
                        if (getfilename == filenametime)
                        {
                            FilePathList.Add(item.FullName);
                        }
                    }

                }
                else
                {
                    ErorStr = datapath + "数据目录不存在";
                }
                if (FilePathList.Count == 0)
                {
                    ErorStr = datapath + "数据目录下无文件";
                }
                bgtime = bgtime.AddHours(1);
            }
            return FilePathList;
 
        }


        /// <summary>
        /// 解析头数据
        /// </summary>
        /// <param name="headstr"></param>
        /// <returns></returns>
        bool ResolveHeadData(string headstr,ref LidarDataItem dt )
        {
           
            string[] arrstr = headstr.Split(';');
            if (arrstr.Length < 2) //空数据
            {
                return false;
            }
            else
            {
                dt.Latitude = arrstr[1];
                dt.Longitude = arrstr[2];
                dt.DataTime =DateTime.Parse( arrstr[3]);
                return true;
            }
        }

        /// <summary>
        /// 解析行数据
        /// </summary>
        /// <param name="headstr"></param>
        /// <returns></returns>
        LidarDataItem  ResolveRowData(RadarDataType datatype, string datarowstr, LidarDataItem headdata,double height)
        {
             LidarDataItem  listdatarows =new  LidarDataItem();
            string[] arrstr = datarowstr.Split(';');
            if (arrstr.Length == 0) //空数据
            {
                return null;
            }
            else
            {
                string strvalues="";
                switch (datatype)
                {
                    case RadarDataType.depol:
                        strvalues = arrstr[3];
                        break;
                    case RadarDataType.extin355:
                        strvalues = arrstr[0];
                        break;
                    case RadarDataType.extin532:
                        strvalues = arrstr[1];
                        break;
                    case RadarDataType.extin1064:
                        strvalues = arrstr[2];
                        break;
                    case RadarDataType.kly:
                        strvalues = arrstr[4];
                        break;
                    default:
                        break;
                }
                double values;
                if (double.TryParse(strvalues, out values))
                {
                    listdatarows.DataTime = headdata.DataTime;
                    listdatarows.DataType = datatype;
                    listdatarows.Height = height/1000; //千米
                    listdatarows.Valeu = values;
                    listdatarows.Longitude = headdata.Longitude;
                    listdatarows.Latitude = headdata.Latitude;
                }
                else
                {
                    return null;
                }

            }
            return listdatarows;
        }
       
      
    }


      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值