這篇討論萃取一個抽象型別完成字串陣列解析為強型別物件的方式,本篇採用介面。
這一篇採用萃取抽象的方式來建立一個公開的轉換行為,這個行為由一個共通的 Interface 來公開;程式碼和上一篇很類似,只是不採用建構子方式。這個方式就有點像一些基本型別,如 System.Int32 實作 IComparable<T> 那種感覺,型別藉由 IComparable<T> 介面公開自己的預設比較行為。
首先,我們萃取出一個抽象行為,為此建立一個介面,就叫它 IParser 吧。
public interface IParser
{
void Parse(string[] items);
}
接著修改兩個基本資料型別,讓他們都實作 IParser
public class DataForTextFile1 : IParser
{
public DataForTextFile1()
{ }
public int Index { get; set; }
public string English { get; set; }
public string Chinese { get; set; }
public void Parse(string[] items)
{
if (items == null)
{ throw new ArgumentNullException(); }
if (items.Count() < 3)
{ throw new ArgumentException(); }
Index = int.Parse(items[0]);
English = items[1];
Chinese = items[2];
}
}
public class DataForTextFile2 : IParser
{
public DataForTextFile2()
{ }
public int Index { get; set; }
public string Person { get; set; }
public DayOfWeek WeekDay { get; set; }
public string Activity { get; set; }
public void Parse(string[] items)
{
if (items == null)
{ throw new ArgumentNullException(); }
if (items.Count() < 4)
{ throw new ArgumentException(); }
Index = int.Parse(items[0]);
Person = items[1];
WeekDay = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), items[2]);
Activity = items[3];
}
}
實作內容其實和前一篇使用建構子差不多,只是在建構子部分我保留了如果傳入 null 就當作沒這回事的行為,這邊的實作則是傳入 null 就發出 ArgumentNullException。
最後 Console 程式當然不可免,和前一篇有一點不太一樣。
class Program
{
static void Main(string[] args)
{
ProcessTextFile1();
Console.WriteLine();
Console.WriteLine("**********************************");
Console.WriteLine();
ProcessTextFile2();
Console.ReadLine();
}
static void ProcessTextFile1()
{
var lines = File.ReadAllLines("TextFile1.txt");
List<DataForTextFile1> list = new List<DataForTextFile1>();
foreach (var line in lines)
{
string[] items = line.Split(',');
if (items != null)
{
var obj = new DataForTextFile1();
Parse(obj, items);
list.Add(obj);
}
}
// 顯示結果
foreach (var item in list)
{
Console.WriteLine(item.Index.ToString());
Console.WriteLine(item.English);
Console.WriteLine(item.Chinese);
Console.WriteLine("---------------------");
}
}
static void ProcessTextFile2()
{
var lines = File.ReadAllLines("TextFile2.txt");
List<DataForTextFile2> list = new List<DataForTextFile2>();
foreach (var line in lines)
{
string[] items = line.Split(',');
if (items != null)
{
var obj = new DataForTextFile2();
Parse(obj,items);
list.Add(obj);
}
}
// 顯示結果
foreach (var item in list)
{
Console.WriteLine(item.Index.ToString());
Console.WriteLine(item.Person);
Console.WriteLine(item.WeekDay);
Console.WriteLine(item.Activity);
Console.WriteLine("---------------------");
}
}
static void Parse(IParser value, string[] items)
{
value.Parse(items);
}
}