博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用...
阅读量:6093 次
发布时间:2019-06-20

本文共 2593 字,大约阅读时间需要 8 分钟。

这个问题困扰了我很久,很觉得设计的不完善,终于在今天把它彻底解决了,其实就是一个C#里的基础知识问题,主要涉及到了,接口,抽象类,接口继承,类继承,多态等知识。

事件是这样的,我有一个统一接口规范的接口,它可以由linq to sql,ado.net和ef等相关数据源去实现(只是举个例,不是实际中的代码)

1     ///  2     /// 数据统一接口规范 3     ///  4     interface ITest 5     { 6         ///  7         /// 插入方法 8         ///  9         void Insert();10     }

而在每一个子类中都去实现了这个接口,比如Testzzl这个实体,它去实现了这个ITest接口

1    ///  2     /// Testzzl实体操作 3     ///  4     class Testzzl :  ITestzzl 5     { 6         ///  7         /// 子类也可以去复写它 8         ///  9         public void Insert()10         {11             Console.WriteLine("子类实现Insert方法");12         }13     }

好了,这样在使用时,可以定义接口类型的对象,通过具体的工具实现接口的多态性。

1   ITestzzl iTestzzl = new Testzzl();2   iTestzzl.Insert();

 

这是我最初写的代码,我总觉得有些不爽,但又说不出来,我知道,我写了很多重复的代码,因为每个子类在实现Insert方法时,它们的代码都是相同的,除非自己逻辑上有需要,再会

真正去实现它。

在一次技术讨论中,终于被经理的所惊醒,“为何不把相同的实现逻辑放在一个基类中呢?”,于是,我改了一下代码,它变成了这样:

1     ///  2     /// 统一实体基类 3     /// 子类共同的操作逻辑 4     ///  5     abstract class TestBase : ITest 6     { 7  8         #region ITest 成员 9 10         public virtual void Insert()11         {12             Console.WriteLine("基类统一实现Insert方法");13         }14 15         #endregion16     }

我们的子类去继承TestBase后,它可以使用基类的Insert()方法,如果子类自己的逻辑有需要,还可以去复写它,看似重复代码的问题解决了,可又有一个问题来了,我们在业务层使用

数据库对象时,一般会以接口对象进行声明,因为它可以帮助我们实现操作的多态性,下面代码出问题了

1  ITestzzl iTestzzl = new Testzzl();2 3  iTestzzl.Insert();

嘿,我们的Insert()方法,找不到了,这是为什么呢?原来在我们的ITestzzl接口中,并没有定义这个方法,实事上,如果希望的ITest的接口应用到ITestzzl接口上,需要去继承一个它,

于是ITestzzl接口变成了这样:

1  interface ITestzzl : ITest {2   // Testzzl实体的一些操作逻辑3  }

 

这时,我们在去调用Insert()方法,就正常了,呵呵,原来是子类接口没有继承统一操作接口的问题呀!

下面是实例的完整代码,供大家参考:

View Code
1     ///  2     /// 数据统一接口规范 3     ///  4     interface ITest 5     { 6         ///  7         /// 插入方法 8         ///  9         void Insert();10     }11     /// 12     /// 统一实体基类13     /// 子类共同的操作逻辑14     /// 15     abstract class TestBase : ITest16     {17 18         #region ITest 成员19 20         public virtual void Insert()21         {22             Console.WriteLine("基类统一实现Insert方法");23         }24 25         #endregion26     }27     interface ITestzzl : ITest { }28     /// 29     /// Testzzl实体操作30     /// 31     class Testzzl : TestBase, ITestzzl32     {33         /// 34         /// 子类也可以去复写它35         /// 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 }

 

转载于:https://www.cnblogs.com/lori/archive/2012/06/20/2556239.html

你可能感兴趣的文章
nginx.conf 文中描述的配置文件
查看>>
yourphp读取分类名称{$Categorys[$r[catid]]['catname']}
查看>>
百度地图插件
查看>>
ecshop广告调用方法
查看>>
矩阵及其变换、特征值与特征向量的物理意义
查看>>
登记申请汇总
查看>>
打印Ibatis最后,SQL声明
查看>>
Scala深入浅出实战经典之 List的foldLeft、foldRight、sort操作代码实战
查看>>
Google最新截屏案例详解
查看>>
2015第31周一
查看>>
2015第31周日
查看>>
在使用EF开发时候,遇到 using 语句中使用的类型必须可隐式转换为“System.IDisposable“ 这个问题。...
查看>>
PHP使用DES进行加密和解密
查看>>
Oracle 如何提交手册Cluster Table事务
查看>>
Android Clipboard(复制/剪贴板)
查看>>
BeagleBone Black第八课板:建立Eclipse编程环境
查看>>
在服务器上用Fiddler抓取HTTPS流量
查看>>
文件类似的推理 -- 超级本征值(super feature)
查看>>
XCode的代码块备份
查看>>
iOs 自定义UIView 日历的实现 Swift2.1
查看>>