您的位置:首页 > 其它

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

2017-11-30 16:01 387 查看
接口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
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;
}

}


      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  .NET 设计 继承
相关文章推荐