高手请进,求解.net问题

Charles雨林 2011-07-29 02:52:46
实现了某个接口就有了某个功能,例如C#中的类若要支持foreach语句,需要实现IEnumerable接口和GetEnumerator ()方法。在使用using(MyClass cls=new MyCLass())语句时必须实现接口 IDisposable。
请问这个内部是如何实现的?比如写个简单的类A和接口B,C实现了这个接口B,调用A的某个方法时会按照C的实现来进行输出运作。求解
...全文
400 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
feng9330 2011-08-01
  • 打赏
  • 举报
回复
如果你的需求是这样,那你就只有用反射了,c最终为一个固定名称的dll,在a中通过反射调用接口的方法;但是这样你还是得修改a的实现,与你不修改a相矛盾。

或者说你考虑进了一个误区,如果a你是自己实现的,你完全没有必要这么做;
class A{
B _b;
A(B b)
{
_b=b;
}
public void Show(){_b.show(); }
}
interface B{ void show();}
class C:B
{
public void Show(){....};
}

你在你的项目调用的时候调用 new A(new C()).show();
这个跟你修改你的show实现来说是两码事了,你修改show,你的c编译的dll就得固定;通过实例化来传递参数一般就是我们用来进行扩展的时候用的
vabug 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cyl_java 的回复:]

class A{ public string show(){……} }
Inteface B{ string test(); }
class C:B { public string test(){ return "OK";}}
请填写A的省略号部分,要完成的功能是,如果C的test方法返回什么,那么A的show就返回什么
[/Quote]

这个功能,我想还是用设计模式里面的Bridge吧,这样就可以分离你的实现。
viki117 2011-08-01
  • 打赏
  • 举报
回复
你鼠标右键IDisposable,察看定义,一看你就明了了,他是Dispose方法的接口,只要实现该方法,using完后,.net自动调用Dispose,至于如何调用,机制问题,你可以不了解,一定要了解,就去MSDN,查资料吧
wangting0613 2011-08-01
  • 打赏
  • 举报
回复
能不能让A:B ?
十一文 2011-08-01
  • 打赏
  • 举报
回复
不知道 面向切面编程 是否能符合 楼主的要求

http://www.cnblogs.com/hliq/archive/2011/03/26/2087216.html


我不怎么弄.net 这次这大头蒜 装的 o(╯□╰)o


恩用反射 似乎是 可以的http://www.cnblogs.com/rijing2004/archive/2007/08/07/845753.html

通过反射动态穿件程序集 同时 可以添加你自己的方法 O(∩_∩)O~
http://www.cnblogs.com/rijing2004/archive/2007/08/09/emit.html
没问题的




十一文 2011-08-01
  • 打赏
  • 举报
回复
汗 似乎我没弄清楚 楼主的意思 随便乱回复了



楼主勿怪

o(╯□╰)o
zl3450341 2011-08-01
  • 打赏
  • 举报
回复
过来友情Up一下
十一文 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 cyl_java 的回复:]

这样说吧,类A和接口B是编译成了DLL,然后在新工程里面加入这个dll,在新工程里才写类C,dll不能改了
[/Quote]

如果编译成了dll

可以用反射
十一文 2011-08-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cyl_java 的回复:]

希望SP1234能够来
[/Quote]
论坛里 可以使用向谁 提问的功能 这样别人会收到邮件 提示你向他提问

有工具的 可以找 伴水清洁工 或者 水源的一些人要!

找我也可以
十一文 2011-08-01
  • 打赏
  • 举报
回复
其实 所谓的实现接口的真正含义

就是说 a定义了 我只调用某个方法这个方法的参数是哪些 ,方法名 是什么 ,返回值是什么
b实现a 就是说 b按照a定义的好的这种方法

这样a运行的时候 就可以不管 b的这个方法里面的具体内容是什么
他只管调用就是


其实不管c# 不管什么语言

甚至是硬件也是这样

计算机之所以这么强大就在于接口约定

接口其实就是相当 两者之间的约定 实现接口就是遵守约定!
vabug 2011-08-01
  • 打赏
  • 举报
回复
我觉得,问题在于你的描述,不切中要害,你还是贴具体的代码,把结构贴出来了,大家就好理解了,好填空拉,你也省得纠结拉。
chen870201 2011-07-30
  • 打赏
  • 举报
回复
似乎和.NET关系不大
lckj2009 2011-07-30
  • 打赏
  • 举报
回复
虽然奇怪,但是.net里是可以只定义不实现的。但是,继承接口的类必须实现所有的接口方法。

我原本也以为不能只定义不实现的,I'm sorry。纠正。
lckj2009 2011-07-30
  • 打赏
  • 举报
回复
“类A和接口B是编译成了DLL,然后在新工程里面加入这个dll,在新工程里才写类C,dll不能改了”

我不明白,如果按你所说类A没有实现接口B,那编译成DLL是怎么通过的?
odp_denden 2011-07-30
  • 打赏
  • 举报
回复
不弄过,顶一下。
冰岛男孩 2011-07-30
  • 打赏
  • 举报
回复
似乎和.NET关系不大
catchdream 2011-07-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 cyl_java 的回复:]

这样说吧,类A和接口B是编译成了DLL,然后在新工程里面加入这个dll,在新工程里才写类C,dll不能改了
[/Quote]
其实我觉得你说的就是一个比较基本的 Template Method设计模式(模版方法模式),你可以上网查查这个模式的特点,我上面的代码实现的也基本是这样一个模式。
另外可以看看这个链接http://tech.ddvip.com/2008-11/122584669888975_2.html
wanghui0380 2011-07-29
  • 打赏
  • 举报
回复
实际也就是常见的那句话“屁股决定脑袋,功能决定实现”

IDE是为了方便你编写,调试代码,为了简化资源释放,才出现了using的语法糖。而既然是要解决资源释放,那他必然要检查是否实现了IDisposable接口

语法糖这一块会用就成,不必特别计较。因为语法糖本身只是对功能包装,他也必然能变成普通的声明(就个递归一样,递归实际也是一种包装,一个递归也必然能变成普通的迭代)
Forget 2011-07-29
  • 打赏
  • 举报
回复
void show()
{
//这个类c所在的程序集的名称
string assemblyName = ConfigurationManager.AppSettings["AssemblyName"];
Assembly ass = Assembly.Load(assemblyName);
//这里需要完全限定名,即命名空间+类型,例如你的命名空间是MyDll
B obj = ass.CreateInstance("MyDll.c") as B;
if (obj != null)
Console.Write(obj.test());
}
wanghui0380 2011-07-29
  • 打赏
  • 举报
回复
语法糖和net本身关系不大,他是IDE和编译器提供的支持,而不是由net框架直接提供的支持
加载更多回复(26)

110,561

社区成员

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

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

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