面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用~续(TestBase继承ITest是多余的?)
在我上一篇文章发表后,收到了很多博友的回复,其中有一位博友提了一个问题,TestBase 继承了ITest是多余的,我认为,我有必要再写一篇文章来说明一下,TestBase为什么要继承ITest,当然各位也可以再次发表自己的看法。
1 /// <summary> 2 /// 数据统一接口规范 3 /// </summary> 4 interface ITest 5 { 6 /// <summary> 7 /// 插入方法 8 /// </summary> 9 void Insert(); 10 }
还是那个统一接口规范,这时,有个ADO.NET 的数据基类,它会去实现它,如下
1 /// <summary> 2 /// 统一实体基类 3 /// ADO.NET操作基类 4 /// </summary> 5 abstract class TestBase : ITest 6 { 7 8 #region ITest 成员 9 10 public virtual void Insert() 11 { 12 Console.WriteLine("使用ADO.NET操作方式去实现它"); 13 } 14 15 #endregion 16 }
而我们的系统中,还有一种数据源,它叫Linq To SQL,同时它又是一个很好的ORM工具,它帮助我们很好的把实体数据库进行映射进来了。它作为由linq to sql产生的实体的基类,去实现统一接口,如下:
1 /// <summary> 2 /// 统一实体基类 3 /// Linq To SQL操作基类 4 /// </summary> 5 abstract class TestBase : ITest 6 { 7 8 #region ITest 成员 9 10 public virtual void Insert() 11 { 12 Console.WriteLine("使用Linq To SQL操作方式去实现它"); 13 } 14 15 #endregion 16 }
这时,我们有两个数据基类去实现了这个统一操作接口,这时,如果有其它数据源,如为单元测试提供的内存流数据库,也是去实现统一操作规范。事实上,在DATA层提供了多种实现统一操作接口的方式,而它们的实体子类需要去分别继承各自的基类和自己的个性化接口接口,而最终使用哪种数据库去实现,我们可以通过IOC进行动态设定它。这只是最底层的层次,事实上,在每个实体操作的接口与实现中,还存在着这种关系,而这种关系一定会被约束在配置文件中,你可以根据配置的方式,在程序运行时去动态创建你的实例,当然这同样是IOC干的事。