接口作为函数参数的问题

drq6772 2008-06-09 11:11:15
请问:当接口作为函数参数的时候,代表什么意思?
...全文
360 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
drq6772 2008-06-09
  • 打赏
  • 举报
回复
我可能是概念有点混乱,楼上的兄弟用 Icheckuser user,其中的user是接口Icheckuser的实例吗?接口不是不能实例化的吗?
wanghui0380 2008-06-09
  • 打赏
  • 举报
回复
没啥特别意思,任何对象都可以当参数

使用接口有可能是封装内部逻辑,让调用者并不用关心函数内部是如何实现的,这样做一是规范调用代码,而是减轻调用者理解业务逻辑的难度(实际上,使用接口你根本不用去关心人家内部是如何做的,传给他接口就成)

比如:传统的一个函数 checkuser(string name,string password);你调用时需要先知道这个函数让你传了两个参数

接口 Icheckuser
{
string name;
string passwrod;
}

内部逻辑: checkuser(接口icheckuser user)
{
if(user.name=="" && user.password=="")
{
//do something
}
}

当你在页面也继承该接口实现(页面和内部类都继承同一接口,这样可以保证程序员都使用同样的规范)
这样调用代码就可以规范成:
form :Icheckuser //继承并实现接口

string name{
get{return TextBox1.Text;}
set {TextBox1.Text=value;}
}

string password{
get{return TextBox2.Text;}
set {TextBox2.Text=value;}
}
checkuser((Icheckuser)this); //这里你不用管内部是如何的,你只管实现你自己该管的事情就行了
fuadam 2008-06-09
  • 打赏
  • 举报
回复
针对接口编程,封装了变化
lya121 2008-06-09
  • 打赏
  • 举报
回复
意义恨难说清。

接口做为参数传递 以及 接口作为返回类型 都是说的实现了这个接口的类的对象。

做多了就容易理解了。
amandag 2008-06-09
  • 打赏
  • 举报
回复
把接口作为函数的参数,那么任何实现了接口的类的实例都可以作为此函数的参数传递
wanghui0380 2008-06-09
  • 打赏
  • 举报
回复

Icheckuser user=(Icheckuser)this//这里不是new而是接口转换,this是在前面new的

interface(接口)
[attributes] [modifiers] interface identifier [:base-list] {interface-body}[;]
一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以从多个基接口继承,而类或结构可以实现多个接口。接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员。接口可以是命名空间或类的成员,并且可以包含下列成员的签名:方法属性 索引器.
一个接口可从一个或多个基接口继承。接口可由类实现。实现的接口的标识符出现在类的基列表中。被继承的接口称为该接口的显式基接口。当接口具有一个或多个显式基接口时,在该接口声明中,接口标识符后跟一个冒号以及由逗号分隔的基接口标识符列表。接口的基接口是显式基接口及其基接口。换言之,基接口集是显式基接口、它们的显式基接口(依此类推)的完全可传递的闭包。接口继承其基接口的所有成员。接口成员是通过 I.M 和 I[A] 形式的成员访问和索引访问表达式访问的,其中 I 是接口类型的实例,M 是该接口类型的方法、属性或事件,A 是索引器参数列表。接口可以由类和结构实现。为了指示类或结构实现接口,在该类或结构的基类列表中包含了接口标识符。在实现类或结构中定位接口成员的实现的过程称为接口映射。

fuadam 2008-06-09
  • 打赏
  • 举报
回复
比如你有个接口
interface IMove
{
void Move();
}
对于人,动物来说都可以Move所以
class Person : IMove
[
public void Move()
{
Console.WriteLine("Person move.");
}
}
class Animal: IMove
[
public void Move()
{
Console.WriteLine("Animal move.");
}
}
这是你可以这样调用IMove接口
public Test
{
public void Run(IMove obj)
{
obj.Move();
}
}
如果这是你的需求变了,比如又增加了Car类
class Car: IMove
[
public void Move()
{
Console.WriteLine("Car move.");
}
}
因为你是针对接口编程的,所以你不需要关心Car或者外星人或者火箭类,这既是面向对象的ocp原则,对修改关闭(针对Run方法)对扩展开发(针对新增的汽车,外星人,火箭类)

111,097

社区成员

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

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

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