求教,关于接口,类,对象的问题

yhjiongge 2012-03-29 06:50:57
//定义一个IFavoriteFood 接口
interface IFavoriteFood
{
void Food();
}

//定义一个IVoice接口
interface IVoice
{
void Voice();
}

//然后定义了一个Cat的类实现这里面的方法:
class Cat:IFavoriteFood ,IVoice
{
public void Food()
{
Console.WriteLine("我喜欢的食物是老鼠.");
}
public void Voice()
{
Console.WriteLine("喵,喵,喵...");
}
}

这个Cat类的功能就是实现两个接口的方法,猫最喜欢的事物是老鼠,而他的声音是“喵,喵,喵”。
class Program
{
static void Main(string[] args)
{
IVoice pVoice = new Cat();
pVoice.Voice();//只能调用IVoice中定义的方法
// pVoice.Food();这个就会报错,因为 IVoice 接口中没有这个方法的定义
IFavoriteFood pFavoriteFood = pVoice as IFavoriteFood;
pFavoriteFood.Food();//只能调用IFavoriteFood定义的方法
Console.ReadLine();
}
}

请教各位:
①IVoice pVoice = new Cat(); 这一句代码中pVoice是一个接口,但是Cat却是一个类,为什么接口能够被实例化为一个类呢?
②IFavoriteFood pFavoriteFood = pVoice as IFavoriteFood;这一句代码中pFavoriteFood是接口IFavoriteFood的实例,pVoice as IFavoriteFood是什么意思呢?
希望各位高手帮忙解答,谢谢了!!!
...全文
129 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheng2005 2012-03-30
  • 打赏
  • 举报
回复
更正一下我上面的话

= 仅仅是一个赋值的过程,这个过程对右侧的东西本身是不会造成影响的的话

这个话有点问题,其实可能是会造成影响的,就是存在装箱拆箱的可能,但是本质是不会影响的。
  • 打赏
  • 举报
回复
为什么接口能够被实例化为一个类呢?
---------------------------
这个说话本身有问题,接口是不能实例化的。IVoice pVoice = new Cat(); 等号左边是声明的变量,右边才是实例化,声明的接口对象,可以是任何实现了该接口的类型的实例


pVoice as IFavoriteFood 将pVoice转换为IFavoriteFood类型,如果pVoice的类型没有实现此接口,整个表达式将为null,但是不会抛出异常
cheng2005 2012-03-29
  • 打赏
  • 举报
回复
问题的关键在于 =
= : 赋值符号,把右侧的东西 赋给 左边的 变量,仅仅是一个赋值的过程,这个过程对右侧的东西本身是不会造成影响的,就好像说,在A网站注册了一个用户,A网站知道有你这么个人,然后你去B网站注册了一个用户,B网站也知道有你这么个人.这个过程中你还是你,没有变化.
这样一解释 ,就是 把 new Cat() 这个东西 给左边 ,左边是IVoice , 那么 Cat这个对象是不是IVoice 呢,是.所以赋值成功了.值得注意的是pVoice 虽然当前声明的类型是IVoice,但其本质还是Cat.
第二个,因为pVoice 的本质是cat ,所以 as IFavoriteFood之后也不为null.因为cat 也是IFavoriteFood.
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复标识为 “代码味道”,但我们大多数都已经学会忍受它。能不能不写重复的dao 呢 ? 泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao的繁多,很多设计都是一个entity对应一个dao (不同的只有名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑改变时,dao需要同时修改两个文件(接口和实现) 在本文中,我将为您展示如何避免再三地重复 DAO 代码。 在这里我建议项目最好使用一个共通的DAO,因为这样会为你省去非常多的,而那些里的逻辑往往差不多。当然是用共通的DAO你需要对结果转型,转成你需要的bean,但这也比写那么多DAO强多了,你可以放下包袱,只关注你的业务逻辑。 如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1.继承 继承是利用现有的创建新的过程,现有的称作基(或父),创建的新称作派生(子)。继承其实就是自动地共享基中成员属性和成员方法的机制。引入继承,实现了代码重用; 2.泛型 泛型型的限定 3.反射 代码概述: bean :Person.java 这个人员我就不说了 泛型dao接口 :GenericDao 泛型作为DAO的通用接口 CRUD方法 dao接口 : PersonDAO extends GenericDao 可以不写代码,方法已经在父泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子的附加方法。 泛型daoimpl :GenericDaoImpl implements GenericDao 必须提供的构造方法,以便创建实例的时候就知道具体实体的型。 daoimpl :PersonDAOImpl extends GenericDaoImpl implements PersonDAO public PersonDAOImpl() { super(Person.class); } 告诉对哪个操作,如不需要自定义扩展方法就作有一个构造方法。 泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层实现一样。 Action : SavePersonAction直接调用PersonService。 下面是代码 为了演示减少代码量而且直观去掉些方法方便读者自己扩展写出适合自己的代码,这里我只抛砖引玉了。主要介绍这个技术。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zylyueliang/archive/2010/09/17/5890043.aspx
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复标识为 “代码味道”,但我们大多数都已经学会忍受它。能不能不写重复的dao 呢 ? 泛型dao,顾名思义就是一个dao可以对多个实体对象进行持久化。当应用中需要使用到上十张表时,DAO的维护变得日益困难,主要表现在这几个方面: 1)dao的繁多,很多设计都是一个entity对应一个dao (不同的只有名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑改变时,dao需要同时修改两个文件(接口和实现) 在本文中,我将为您展示如何避免再三地重复 DAO 代码。 在这里我建议项目最好使用一个共通的DAO,因为这样会为你省去非常多的,而那些里的逻辑往往差不多。当然是用共通的DAO你需要对结果转型,转成你需要的bean,但这也比写那么多DAO强多了,你可以放下包袱,只关注你的业务逻辑。 如果你真能只用一个dao解决,那么祝贺你,你得到了一个虚拟数据层(高度抽象的数据接口)。这是一个比dao更高级的存在。 欢迎大家指正 -_- 虚心求教 代码层次: bean-->dao-->service-->action 技术概述:1.继承 继承是利用现有的创建新的过程,现有的称作基(或父),创建的新称作派生(子)。继承其实就是自动地共享基中成员属性和成员方法的机制。引入继承,实现了代码重用; 2.泛型 泛型型的限定 3.反射 代码概述: bean :Person.java 这个人员我就不说了 泛型dao接口 :GenericDao 泛型作为DAO的通用接口 CRUD方法 dao接口 : PersonDAO extends GenericDao 可以不写代码,方法已经在父泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子的附加方法。 泛型daoimpl :GenericDaoImpl implements GenericDao 必须提供的构造方法,以便创建实例的时候就知道具体实体的型。 daoimpl :PersonDAOImpl extends GenericDaoImpl implements PersonDAO public PersonDAOImpl() { super(Person.class); } 告诉对哪个操作,如不需要自定义扩展方法就作有一个构造方法。 泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层实现一样。 Action : SavePersonAction直接调用PersonService。 下面是代码 为了演示减少代码量而且直观去掉些方法方便读者自己扩展写出适合自己的代码,这里我只抛砖引玉了。主要介绍这个技术。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zylyueliang/archive/2010/09/17/5890043.aspx

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧