首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何从Interface(接口)获取数据啊? [已结贴,结贴人:xwx520]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xwx520
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-23 19:18:32 楼主
    常听说做开发的时候,调用别人的接口,或者说把自己的东西抽象出来,对外只暴露接口。比如在C#中,要实现定制类排序我们需要实现Icomparable接口里面的一个方法。但我想不明白的是,为什么我们实现了这个接口里的方法就可以实现排序了呢?Icomparable接口是怎么样去实现这个排序的啊?

    大家都说“接口只是一个规范,不提供任何实现的。一般用类来实现这个接口,当这个类的实现出现修改时,对调用接口的人而言却是没有任何影响的。比如说一个接口提供一个方法,然后我有A、B、C、D四个类都能实现这个接口,那调用这个接口的人就根本不用管我具体是用哪个类来实现这个接口的 ”。我在这里就不明白了,比如有A和B两个项目,A项目对B公开API,B根据A提供的API进行数据的获取等。但是A只是提供一个接口而已,而且你又不能这样来用:Animal a = new Animal()来调用相关方法,你必需知道有哪个类实现了Animal;比方说A项目中有一个类Cat实现接口Animal,在A项目对B公开的API中Animal有一个方法 Cat GetCat();  上面也说了“根本不用管我具体是用哪个类来实现这个接口的”,那么就不用能Animal animal = new Cat()来实例化了,那B项目如何编写代码来获取Cat数据呢?

    Animal:
    public interface Animal{
          Cat GetCat();
    }

    Cat:
    public class Cat:Animal{
          public Cat GetCat()
          {
              ///Get data
              return cat;
          }
    }
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LQknife
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 20:20:521楼 得分:0
    Icomparable是你自己来实现比较
    Animal animal = new Cat()这个还是要的,不过可以重新再包装一下不直接new
    但是到这句的时候animal.GetCat()的就 根本不用管我具体是用哪个类来实现这个接口的
    我只要你能GetCat()就行了
    接口只是一种约定
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oyiboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 20:33:232楼 得分:5
    接口只是一种约定。某一部份类都会有这样的方法或是属性。如:

    C# code
    public interface IDataItem{ string id{get;set;} } public class AClass { public getDataID(IDataItem item) { return item.id; } }


    上面的代码中,AClass.getDataID并不知道item是哪个类的实例,但他也不用管那是哪个类的实例,只要这个实例的类实现了IDataItem,那么这个程序就可以通过。否则就会抛出错误。

    换种说法就是,凡是属于某种类型的类统统都实现IDataItem这个约定,大家都有id这个属性。使用时不管是谁都可以直接获取这个属性。方法也一样。lz说的Icomparable接口,就是告诉其它类说,我这个类是可以排序的,排序时需要用的东西和Icomparable接约定的一样,你们在使用时就参照Icomparable约定的结构来使用吧。就是这样。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • peachlee
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 20:48:133楼 得分:0
    接口和实现类,具有父子关系,父给子有向下传递标准的必然,一般我们讲究抽象一级的抽象类和接口之间做具体的关系,而具体类之间不打交道,就是要是子类可以转化成父类,达到抽象,传递数据达到通用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wjp_116
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 21:29:064楼 得分:0
    1.接口中定义了方法的声明,就像并口硬盘定义数据线是80针脚,(这是标准)
      你的定制类实现这个方法,就像不同的硬盘厂商做得硬盘别的地方可能不同,但数据线肯定是80针脚,这块硬盘才可以组装到电脑里,你调用这个接口中定义好的声明方法,就可以实现排序(排序的实现是靠你实现这个方法来完成的) 

    2.你可以通过反射等方法将cat的实例赋给Animal对象,那么你调用Animal的方法时实际是调用了cat类实现的方法,当然,也可以用别的类实现Animal方法                   
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xwx520
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 10:41:375楼 得分:0
    引用 2 楼 oyiboy 的回复:
    接口只是一种约定。某一部份类都会有这样的方法或是属性。如:


    C# codepublic interface IDataItem{
          string id{get;set;}
    }

    public class AClass
    {
      public getDataID(IDataItem item)
      {
      return item.id;
      }
    }


    上面的代码中,AClass.getDataID并不知道item是哪个类的实例,但他也不用管那是哪个类的实例,只要这个实例的类实现了IDataItem,那么这个程序就可以通过。否则就会抛出错误。 …


    你的意思是说,B项目要使用一个类 BClass 实现IDataItem接口,然后去使用
    AClass aclass = new AClass();
    aclass.getDataID(BClass);
    ,是这样去获取数据吗?
    那就是说B项目必须知道A提供的接口IDataItem和其实现的类AClass ,而A项目不知道B实现IDataItem的类BClass 。这就是所说的Interface说内涵吗?
    还是说B项目只需要知道IDataItem接口,不需要知道类AClass ?
    A需要知道B什么,B需要知道A什么,这到底是怎么一个关系?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oyiboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 11:11:476楼 得分:5
    A不需要知道B是什么,只要B实现IDataItem,getDataID方法即可正常运行。
    B不需要知道A是什么,只要考虑实现IDataItem接口内约定的方法和属性即可。

    关于五楼处说的
    aclass.getDataID(BClass);
    也可以是
    IDataItem dItem=new BClass();
    aclass.getDataID(dItem);
    亦可以用工厂模式选择需要的IDataItem,如:
    C# code
    public IDataItem itemFactory(string Blip) { switch(Blip) { case "a":return new AItem();break; case "b":return new BItem();break; case "c":return new CItem();break; ... } } AClass.getDataID(itemFactory("b"));



    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xwx520
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 11:44:377楼 得分:0
    你们说的好像都是正确的,不知道是不是我还转不过弯来,感觉跟我问的问题不大对头。

    高手们能不能写一个简单的例子出来,就是:

    1、有两个A和B项目,A项目为B项目提供API接口。
    2、B项目根据A项目提供的API从A项目中获取数据
    3、写的时候最好能把代码分开,不要把AB项目的代码都放在一个项目里面,这样我才能更好的理解分层。

    谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xwx520
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 11:49:398楼 得分:0
    补充一下:

    引用 6 楼 oyiboy 的回复:
    A不需要知道B是什么,只要B实现IDataItem,getDataID方法即可正常运行。
    B不需要知道A是什么,只要考虑实现IDataItem接口内约定的方法和属性即可。

    关于五楼处说的
    aclass.getDataID(BClass);
    也可以是
    IDataItem dItem=new BClass();
    aclass.getDataID(dItem);
    亦可以用工厂模式选择需要的IDataItem,如:

    C# codepublic IDataItem itemFactory(string Blip)
    {
      switch(Blip)
      {
          case "a":ret…



    按照六楼所说,A不需要知道B是什么,B不需要知道A是什么,那么
    IDataItem dItem=new BClass();
    aclass.getDataID(dItem);

    如果项目A不知道项目B的实现类BClass,如何能够进行new BClass(); ?
    如果项目B不知道项目A的实现类AClass,如何能够进行aclass.getDataID(dItem); ?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oyiboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 15:52:089楼 得分:0
    一个接口可以包括N个类,在写AClass时针对的是实现IDataItem接口的所有类,而不是特别指定BClass,只要实现了IDataItem的接口,可以是各种各样的类。
    所谓的不知道,只是在写AClass时可以不用顾及实际使用时所指定的是哪个类而不是说能凭空使用不存在的类。
    你真正使用到AClass.getDataID时还是要根据需要去选择实现IDataItem接口的类实例。
    即时使用工厂模式,那也是用特别的标记来指定使用的类实例。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xwx520
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 16:11:0210楼 得分:0
    引用 9 楼 oyiboy 的回复:
    一个接口可以包括N个类,在写AClass时针对的是实现IDataItem接口的所有类,而不是特别指定BClass,只要实现了IDataItem的接口,可以是各种各样的类。
    所谓的不知道,只是在写AClass时可以不用顾及实际使用时所指定的是哪个类而不是说能凭空使用不存在的类。
    你真正使用到AClass.getDataID时还是要根据需要去选择实现IDataItem接口的类实例。
    即时使用工厂模式,那也是用特别的标记来指定使用的类实例。



    你的意思是说,如果B项目要取得A项目中的数据,不仅要知道A提供的接口IDataItem,还要知道A项目中是哪些类实现了接口IDataItem(如AClass),是这样吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oyiboy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 18:54:2111楼 得分:10
    发现你看这个问题的方向有点问题。
    如:
    两个项目,一个提供数据模型Model,一个提供数据处理操作Controller。
    Model实现接口与接口实现类,如:
    C# code
    //接口 public interface IDataItem{ string id{get;set;} } //实现接口 public class aDataItem : IDataItem{ public string id{ ... } } public class bDataItem : IDataItem{ public string id{ ... } } public class cDataItem : IDataItem{ public string id{ ... } } .......


    Controller通过接口来针对不同集合类处理。
    “根本不用管我具体是用哪个类来实现这个接口的”是指在编写Controller代码时的说法,如:
    C# code
    public class DataHelper { //获取DataItem的ID号,在这里我不用知道这个item是谁的实例{aDataItem?bDataItem?还是cDataItem完不不用管} public string getDataItemID(IDataItem item){ return item.id; } }


    最后在View层根据实际情况来使用Model中的数据模型和Controller中的处理类,如:
    C# code
    protected void Page_Load(object sender, EventArgs e) { DataHelper dh = new DataHelper(); Response.Write(dh.getDataItemID(new aDataItem()));//这里new的类只要是实现了IDataItem接口的都通通可以通过。 Response.Write(dh.getDataItemID(new bDataItem())); Response.Write(dh.getDataItemID(new cDataItem())); ... }


    大至就是这样,理论没学好,所以,可能有一些地方说错了,但大至思路就是这样
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chen3002min
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 19:33:2212楼 得分:0
    一时间看不明,留个记号慢慢看
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xwx520
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 20:39:4913楼 得分:0
    引用 11 楼 oyiboy 的回复:
    发现你看这个问题的方向有点问题。
    如:
    两个项目,一个提供数据模型Model,一个提供数据处理操作Controller。
    Model实现接口与接口实现类,如:

    C# code
    //接口
    public interface IDataItem{ string id{get;set;} }

    //实现接口
    public class aDataItem : IDataItem{ public string id{ ... } }
    public class bDataItem : IDataItem{ public string id{ ... } }
    public class cDataItem : IDataItem{ public …


    谢谢,你说得对,可能我看这个问题有点偏了,我一直以为A项目只提供API给B项目就可以了,也就是B项目只是使用A项目的接口,并不使用A项目的实现类。谢谢。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved