用接口实例化的对象和类实例化的对象有什么差别?

jarodzhao 2009-01-07 03:47:20
看到 petshop 中有这样的方法,具体的含义是什么?
return (PetShop.IDAL.IAccount) Assembly.Load(path).CreateInstance(className);


自己尝试着写了一个类似的功能,发现实例出的对象没什么差别?恳请高手指点一下。。。


Iface f = new face();
face f1 = new face();


interface Iface
{
int Foo(int i);
}

class face : Iface
{
public int Foo(int i)
{ return i; }
}


...全文
269 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jarodzhao 2009-01-08
  • 打赏
  • 举报
回复
好的,谢谢各位
买了本《C# 入门经典》
jimu8130 2009-01-07
  • 打赏
  • 举报
回复
假设你的实现类有public属性,那么你觉得你的第一种写法得到的对象能获取到该属性么?


建议lz好好读读博客园中anytao的你必须知道的。net系列文章
jarodzhao 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhanglei5415 的回复:]
先不说反射,IAccount dal = PetShop.DALFactory.Account.Create();
难道返回的不是一个对象,而是一个接口吗?!

---------------------------------------------------------

这个是"里氏代换"法则,子类以父类的身份出现
[/Quote]

怎么我看的教程中都没有提到这些呢?
ReyZhang 2009-01-07
  • 打赏
  • 举报
回复
先不说反射,IAccount dal = PetShop.DALFactory.Account.Create();
难道返回的不是一个对象,而是一个接口吗?!

---------------------------------------------------------

这个是"里氏代换"法则,子类以父类的身份出现
jarodzhao 2009-01-07
  • 打赏
  • 举报
回复

return (PetShop.IDAL.IAccount) Assembly.Load(path).CreateInstance(className);

[Quote=引用 10 楼 zpcoder 的回复:]
Assembly.Load(path).CreateInstance(className); 通过反射,得到了一个对象

前面的 (PetShop.IDAL.IAccount)是为了把这个对象转换成都市个 PetShop.IDAL.IAccount 类型的接口
相当于这个格式
(TextBox)Customer1.FindControl("txtUserName");

然后返回了这个接口,这跟 实例化 一点关系都没有
[/Quote]

先不说反射,IAccount dal = PetShop.DALFactory.Account.Create();
难道返回的不是一个对象,而是一个接口吗?!
ReyZhang 2009-01-07
  • 打赏
  • 举报
回复
高层模块不依赖于低层模块,两者都依赖于抽象,既然都依赖于抽象,使扩展成为可能
zpcoder 2009-01-07
  • 打赏
  • 举报
回复
return (PetShop.IDAL.IAccount) Assembly.Load(path).CreateInstance(className);


Assembly.Load(path).CreateInstance(className); 通过反射,得到了一个对象

前面的 (PetShop.IDAL.IAccount)是为了把这个对象转换成都市个 PetShop.IDAL.IAccount 类型的接口
相当于这个格式
(TextBox)Customer1.FindControl("txtUserName");

然后返回了这个接口,这跟 实例化 一点关系都没有
ReyZhang 2009-01-07
  • 打赏
  • 举报
回复
面向接口编程其实就是面向超类编程
目的是多态
chy3503319 2009-01-07
  • 打赏
  • 举报
回复
比如你有两个数据源,oracle和sqlserver

调用--接口---oracle实现类
---sqlserver实现类
---其它
多态,解藕,规范
你的调用层不用改代码,只需要实例的时候换一下实现类就行了
BossFriday 2009-01-07
  • 打赏
  • 举报
回复
从运行时上讲.用接口时,多了强类型转换一步.
HDNGO 2009-01-07
  • 打赏
  • 举报
回复
用到多态就有用了~
xtra6714 2009-01-07
  • 打赏
  • 举报
回复
Assembly.Load(path).CreateInstance(className)
采用反射的方式声明对象
jarodzhao 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jojoqiong 的回复:]
接口定义的是一种规范,用接口产生对象在new时,可以指向他的任何一个子类。如果用类,那么只能new他自己的类,
[/Quote]

你是说可以指向实现这个接口的任何一个类?还是继承于这个类的之类?!
另外能不能说一下 petshop 中的
Assembly.Load(path).CreateInstance(className)

什么含义?
xtra6714 2009-01-07
  • 打赏
  • 举报
回复
像你写的这段没有任何区别

使用接口也好,使用抽象基类也好,目的只有一个多态
jojoqiong 2009-01-07
  • 打赏
  • 举报
回复
接口在抽象工厂中使用的 相当的多,在那个里面才真正体现出了他的价值。
jojoqiong 2009-01-07
  • 打赏
  • 举报
回复
接口定义的是一种规范,用接口产生对象在new时,可以指向他的任何一个子类。如果用类,那么只能new他自己的类,

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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