程序设计选择接口还是选择基类?那个更适合。
2017-11-30 16:01
387 查看
接口VS基类,应该如何选择哪?
首先判断类之间关系(业务关系),代码重用性,接口与基类区别,代码是否可重编译。
1、类之间关系 如是is_a 关系的那选择基类,如苹果属于水果类吗 ? 是的 那应选择基类方式来已继承方式。
2、代码重用性,如果各个类中有重复方法过程,那就最好选择基类继承方式来减少重复代码复制。
3、接口与基类,继承区别:子类只能继承一个基类,但可以实现多个接口。
4、接口如有修改变化那实现子类将会强迫实现接口中的变化,而基类方式不一定要强迫子类去修改,可不重新编译源代码。
实例代码如下:
首先判断类之间关系(业务关系),代码重用性,接口与基类区别,代码是否可重编译。
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 d4bb ) { 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; } }
相关文章推荐
- [置顶] 多条件嵌套分支: 设计一个程序,根据天气情况选择外出或在家。 外出是逛街还是逛公园,在家是看电影还是玩游戏
- 设计:基类还是接口
- CLR via C# 13.11 设计:基类还是接口
- php中选择mysql接口还是mysqli接口来访问MySQL
- PostQuitMessage(0)要慎用,经常会造成MFC程序退出时内存泄露,还是尽量使用MFC基类的退出函数比较好。
- Java 接口大全、面向接口编程、什么时候使用接口,选择Java接口还是抽象类
- 选择接口还是抽象类?---应用实例说明接口与抽象类的应用场合(区别)
- 接口的设计应该从小到大,还是从大到小?
- 什么时候使用接口?什么时候使用抽象?选择Java接口还是抽象类 (转)
- 【Thinking in Java笔记】选择类还是接口
- 如何选择使用抽象类还是接口
- 来选择一款适合你网站的CMS建站程序吧
- 程序设计二:基于接口程序设计思想的模板实现、面向方面的程序设计
- Java 接口大全、面向接口编程、什么时候使用接口。选择Java接口还是抽象类
- 选择接口还是抽象类?---应用实例说明接口与抽象类的应用场合(区别)
- mobile下如何判断出程序选择的是wap还是net网络
- 微软对基类的使用手册, 觉得与现在流行的针对接口设计思想不是很合拍~~!!!
- 适合seo的CMS程序选择标准
- 选择接口还是选择抽象类呢?面向接口编程
- 什么时候使用接口?什么时候使用抽象?选择Java接口还是抽象类 (转)