面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用
2012-07-01 20:36
666 查看
这个问题困扰了我很久,很觉得设计的不完善,终于在今天把它彻底解决了,其实就是一个C#里的基础知识问题,主要涉及到了,接口,抽象类,接口继承,类继承,多态等知识。
事件是这样的,我有一个统一接口规范的接口,它可以由linq to sql,ado.net和ef等相关数据源去实现(只是举个例,不是实际中的代码)
而在每一个子类中都去实现了这个接口,比如Testzzl这个实体,它去实现了这个ITest接口
好了,这样在使用时,可以定义接口类型的对象,通过具体的工具实现接口的多态性。
这是我最初写的代码,我总觉得有些不爽,但又说不出来,我知道,我写了很多重复的代码,因为每个子类在实现Insert方法时,它们的代码都是相同的,除非自己逻辑上有需要,再会
真正去实现它。
在一次技术讨论中,终于被经理的所惊醒,“为何不把相同的实现逻辑放在一个基类中呢?”,于是,我改了一下代码,它变成了这样:
我们的子类去继承TestBase后,它可以使用基类的Insert()方法,如果子类自己的逻辑有需要,还可以去复写它,看似重复代码的问题解决了,可又有一个问题来了,我们在业务层使用
数据库对象时,一般会以接口对象进行声明,因为它可以帮助我们实现操作的多态性,下面代码出问题了
嘿,我们的Insert()方法,找不到了,这是为什么呢?原来在我们的ITestzzl接口中,并没有定义这个方法,实事上,如果希望的ITest的接口应用到ITestzzl接口上,需要去继承一个它,
于是ITestzzl接口变成了这样:
这时,我们在去调用Insert()方法,就正常了,呵呵,原来是子类接口没有继承统一操作接口的问题呀!
下面是实例的完整代码,供大家参考:
![](http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
View
Code
事件是这样的,我有一个统一接口规范的接口,它可以由linq to sql,ado.net和ef等相关数据源去实现(只是举个例,不是实际中的代码)
1 /// <summary> 2 /// 数据统一接口规范 3 /// </summary> 4 interface ITest 5 { 6 /// <summary> 7 /// 插入方法 8 /// </summary> 9 void Insert(); 10 }
而在每一个子类中都去实现了这个接口,比如Testzzl这个实体,它去实现了这个ITest接口
1 /// <summary> 2 /// Testzzl实体操作 3 /// </summary> 4 class Testzzl : ITestzzl 5 { 6 /// <summary> 7 /// 子类也可以去复写它 8 /// </summary> 9 public void Insert() 10 { 11 Console.WriteLine("子类实现Insert方法"); 12 } 13 }
好了,这样在使用时,可以定义接口类型的对象,通过具体的工具实现接口的多态性。
1 ITestzzl iTestzzl = new Testzzl(); 2 iTestzzl.Insert();
这是我最初写的代码,我总觉得有些不爽,但又说不出来,我知道,我写了很多重复的代码,因为每个子类在实现Insert方法时,它们的代码都是相同的,除非自己逻辑上有需要,再会
真正去实现它。
在一次技术讨论中,终于被经理的所惊醒,“为何不把相同的实现逻辑放在一个基类中呢?”,于是,我改了一下代码,它变成了这样:
1 /// <summary> 2 /// 统一实体基类 3 /// 子类共同的操作逻辑 4 /// </summary> 5 abstract class TestBase : ITest 6 { 7 8 #region ITest 成员 9 10 public virtual void Insert() 11 { 12 Console.WriteLine("基类统一实现Insert方法"); 13 } 14 15 #endregion 16 }
我们的子类去继承TestBase后,它可以使用基类的Insert()方法,如果子类自己的逻辑有需要,还可以去复写它,看似重复代码的问题解决了,可又有一个问题来了,我们在业务层使用
数据库对象时,一般会以接口对象进行声明,因为它可以帮助我们实现操作的多态性,下面代码出问题了
1 ITestzzl iTestzzl = new Testzzl(); 2 3 iTestzzl.Insert();
嘿,我们的Insert()方法,找不到了,这是为什么呢?原来在我们的ITestzzl接口中,并没有定义这个方法,实事上,如果希望的ITest的接口应用到ITestzzl接口上,需要去继承一个它,
于是ITestzzl接口变成了这样:
1 interface ITestzzl : ITest { 2 // Testzzl实体的一些操作逻辑 3 }
这时,我们在去调用Insert()方法,就正常了,呵呵,原来是子类接口没有继承统一操作接口的问题呀!
下面是实例的完整代码,供大家参考:
![](http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
View
Code
1 /// <summary> 2 /// 数据统一接口规范 3 /// </summary> 4 interface ITest 5 { 6 /// <summary> 7 /// 插入方法 8 /// </summary> 9 void Insert(); 10 }
11 /// <summary>
12 /// 统一实体基类
13 /// 子类共同的操作逻辑
14 /// </summary>
15 abstract class TestBase : ITest
16 {
17
18 #region ITest 成员
19
20 public virtual void Insert()
21 {
22 Console.WriteLine("基类统一实现Insert方法");
23 }
24
25 #endregion
26 }
27 interface ITestzzl : ITest { }
28 /// <summary>
29 /// Testzzl实体操作
30 /// </summary>
31 class Testzzl : TestBase, ITestzzl
32 {
33 /// <summary>
34 /// 子类也可以去复写它
35 /// </summary>
36 public override void Insert()
37 {
38 Console.WriteLine("子类实现Insert方法");
39 }
40 }
41
42 class Program{
43 static void Main(string[] args)
44 {
45 ITestzzl iTestzzl = new Testzzl();
46
47 iTestzzl.Insert();
48 Console.ReadKey();
49 }
50 }
相关文章推荐
- 面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用~续(TestBase继承ITest是多余的?)
- 面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用
- 数据底层操作告诉了我们接口,抽象类,继承与多态性的使用
- 接口,抽象类,继承与多态性的使用
- 黑马程序员————面向对象(继承,抽象类,接口,多态,异常)
- 黑马程序员 Java基础 面向对象:继承、final关键字、抽象类、模版方法模式、接口、多态、Object类
- 黑马程序员_java的面向对象(对第七课继承..抽象类..接口及fianl应用总结)
- java 中什么时候用抽象类,什么时候用 接口(面向对象的继承与多态)
- Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性
- java面向对象—抽象类、接口与多继承
- 在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序员操作成批的数据或对象元素极为方便。这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结
- 黑马程序员-17-java基础-面向对象(3)-继承、抽象类、接口与多态
- 我们神码小组第一次合作完成的java项目——类的多态继承与接口的使用练习。
- Java基础——面向对象——继承、抽象类、接口、多态、包、内部类、异常等
- 黑马程序员——第7天——(面向对象)继承,final关键字,抽象类,接口
- 初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)
- Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性
- Java基础(面向对象三——继承、final关键字、抽象类、接口)
- jdbc使用 Statement 接口实现添加数据操作小例子
- java面向对象—抽象类、接口与多继承