none
对象使用 RRS feed

  • 问题

  • 有些 接口 抽象函数等这些在写代码的时候,我看也用不着啊,即使没有它代码也照样用。我现在体会不到他们有什么好处。像一些数据集,DataSet,等这些东西要学习源代码的时候感觉很难,但是控件直接把很难的部分给封装起来了,下面就是很简单的操作了。我感觉想提升水平,不知从哪里下手。书上基本的东西也都学了,但是看一些代码和操作,我都没见过。。、

    请老手指点指点!!!!
    2009年8月8日 8:36

答案

  • 搂主,您好。

    1、这是一个从面向过程到面向对象的思想蜕变的过程,非一朝一夕能体会,所以搂主不用操之过急。就我个人也是多年以后才有所体会。(哈,当然不排除我笨的因素!)

    2、这是一个从面向具体编程到面向接口和抽象编程的思想转变。接口和抽象就类试一种契约。
        举个简单的例子:System.Data.SqlClient.SqlDataAdapter、System.Data.OracleClient.OracleDataAdapter、System.Data.OleDb.OleDbDataAdapter 都继承DbDataAdapter,    IDbDataAdapter,  IDataAdapter, ICloneable。
    在客户程序端使用通常我们这么写:
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    ......
    adapter.fill(dataTable)
    以上体现的面向具体的编程

    而面向接口编程,我们可以这么写:
    IDataAdapter adapter = AdapterFactory.Create("SqlServer")
    ......
    adapter.fill(dataTable)
    这样写就可以用一个简单的工厂类和配置文档来动态的产生是针对SqlServer、Oracle还是DB2等等,这样就使用到了设计重用得概念,将具体实现解耦,通过简单的配置就可以适应不同的数据库。

    将来微软要扩充对DB2\Sybase等数据库的支持时也是实现这些接口做扩展。而对于我们使用者来说,只要修改AdapterFactory.Create的内部实现,也能增加对DB2\Sybase的支持。

    3、多了解设计模式,从中体会面向对象的设计原则,其实接口和抽象都是为了日后的扩展。而具体类确实可以直接运行,可惜无法扩展。
        多观察观察.net framework ,在.Net框架内部到处都能找到接口和抽象类。
       从小到实现ICollection的集合,到WebForm和WinForm,再到wf、wcf等等,其中包含了很多面向对象的概念和设计模式。

       以上个人理解,请参考,希望有所帮助!
    • 已标记为答案 茉莉花 2009年8月9日 5:20
    2009年8月8日 9:09

全部回复

  • 搂主,您好。

    1、这是一个从面向过程到面向对象的思想蜕变的过程,非一朝一夕能体会,所以搂主不用操之过急。就我个人也是多年以后才有所体会。(哈,当然不排除我笨的因素!)

    2、这是一个从面向具体编程到面向接口和抽象编程的思想转变。接口和抽象就类试一种契约。
        举个简单的例子:System.Data.SqlClient.SqlDataAdapter、System.Data.OracleClient.OracleDataAdapter、System.Data.OleDb.OleDbDataAdapter 都继承DbDataAdapter,    IDbDataAdapter,  IDataAdapter, ICloneable。
    在客户程序端使用通常我们这么写:
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    ......
    adapter.fill(dataTable)
    以上体现的面向具体的编程

    而面向接口编程,我们可以这么写:
    IDataAdapter adapter = AdapterFactory.Create("SqlServer")
    ......
    adapter.fill(dataTable)
    这样写就可以用一个简单的工厂类和配置文档来动态的产生是针对SqlServer、Oracle还是DB2等等,这样就使用到了设计重用得概念,将具体实现解耦,通过简单的配置就可以适应不同的数据库。

    将来微软要扩充对DB2\Sybase等数据库的支持时也是实现这些接口做扩展。而对于我们使用者来说,只要修改AdapterFactory.Create的内部实现,也能增加对DB2\Sybase的支持。

    3、多了解设计模式,从中体会面向对象的设计原则,其实接口和抽象都是为了日后的扩展。而具体类确实可以直接运行,可惜无法扩展。
        多观察观察.net framework ,在.Net框架内部到处都能找到接口和抽象类。
       从小到实现ICollection的集合,到WebForm和WinForm,再到wf、wcf等等,其中包含了很多面向对象的概念和设计模式。

       以上个人理解,请参考,希望有所帮助!
    • 已标记为答案 茉莉花 2009年8月9日 5:20
    2009年8月8日 9:09
  • 同时提供一个我认为很棒的小理论:两顶帽子的理论。
    1、当设计接口、抽象和具体类时。带一顶“设计”帽子。这时需要考虑未来的变化和扩展。
    2、当作为使用者时。带一顶“客户”帽子。这时候是作为“设计”的“客户”。
    实际上也就是时刻保持从两个角度来看接口、抽象和类之间的关系。现在有很多开源的项目,即提供了实现的组件代码又提供了单元测试代码。正是这个原因。
    这也是TDD(测试驱动开发)的一部分。
    2009年8月8日 9:15
  • 你好,楼主
    对于你提到的抽象函数和接口其实还是很有用的,举个简单的例子,你的一个程序,如果需要实现几种不同的数据库提供程序的时候你要怎么做?也就是说你的程序需要支持SQl Server 、Access等等,但是具体使用由使用者选取。
    这个时候如果你定义一个接口,里边定义了一些方法,比如
    IUserDataProvider
    {
    AddUser(string userName,string password)
    DeleteUser(string userName)
    }
    这样针对不同的数据库可能一些操作是不同的 语句也有可能不同,这样通过接口来实现就很有用了

    抽象类也很用,比如你的一个基类 名字是动物,这类有个方法 吃东西,或者属性喜欢吃的东西
    但是针对不同的动物有不同的这个方法实现和喜欢的东西 定义成抽象的就很好实现了 比如一个类 小狗 继承自 动物


    至于你提到的提高水平 我觉得首先是把基础掌握好就很好了 然后才能融会贯通,多看一些程序方面的思想、设计模式,比看代码更有用;如果你要看那些类里边的复杂代码 你可以通过Reflector来反编译查看
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月8日 12:02
    版主
  • 你好!
         上面大家的建议都很好,编程的思想需要在实践中慢慢的体会才行!
         建议您多看一些经典的项目的源代码,来体会各种编程思想的具体应用,推荐你看看微软提供的PetShop项目,里面大量应用了各种编程的技巧和方法,应该对你有帮助!
    周雪峰
    2009年8月8日 12:29
    版主