对于接口不太理解

wrost 2012-08-24 08:36:19
public IList<string> GetShipCountries() 中 IList是表示接口对吧


再看,但是函数返回的却是List<string>
List<string> countries =new List<string>();
return countries;


问题
1.接口到底是什么东西,该什么时候用
2.函数不是要求返回接口吗public IList<string>? 为什么返回的是List<string> ?

谢谢




public IList<string> GetShipCountries()
{
OrderDAL orderDAL = new OrderDAL();
List<string> countries =new List<string>();
if (orders != null && orders.Count > 0)
{
foreach (Order order in orders)
{
if (!countries.Contains(order.ShipCountry))
{
countries.Add(order.ShipCountry);
}
}
}
else
{
countries = orderDAL.GetShipCountries();
}

return countries;
}
...全文
410 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
wrost 2012-09-18
  • 打赏
  • 举报
回复
谢谢大家的解释,我看了下基础教程,理解了一些。 具体应用在实践中去理解
rczjp 2012-08-25
  • 打赏
  • 举报
回复
接口:
1、约束
2、解决多继承的问题
3、可以看作是父类
rczjp 2012-08-25
  • 打赏
  • 举报
回复
接口:
1、约束
2、解决多继承的问题
3、可以看作是父类
rczjp 2012-08-25
  • 打赏
  • 举报
回复
public interface IMobileStorage
{
void Read();
void Write();
}

--------------存储设备------------
public class FlashDisk : IMobileStorage
{
public void Read() { Console.WriteLine("闪存正在读..."); Console.WriteLine("完毕!"); }
public void Write() { Console.WriteLine("闪存正在写..."); Console.WriteLine("完毕!"); }
}
public class MobileHardDisk:IMobileStorage
{
public void Read() { Console.WriteLine("移动硬盘正在读..."); Console.WriteLine("完毕!"); }
public void Write() { Console.WriteLine("移动硬盘正在写..."); Console.WriteLine("完毕!"); }
}
---------------电脑处理插入进来的存储设备
public class Computer
{
private IMobileStorage _USBStorage;
public IMobileStorage USBStorage
{
get { return _USBStorage; }
set { _USBStorage = value; }
}

public void ReadData() { this.USBStorage.Read(); }
public void WriteData() { this.USBStorage.Write(); }
}





---------当新的设备方法名与接口定义的不一样的情况
public class NewStorage
{
public void Rd() { Console.WriteLine("新的存储设备正在读..."); Console.WriteLine("完毕!"); }
public void Wt() { Console.WriteLine("新的存储设备正在写..."); Console.WriteLine("完毕!"); }
}
//通过“适配器”转换成一样的方法名
public class StorageAdapter : IMobileStorage
{
private NewStorage _NewMobileStorage;
public NewStorage NewMobileStorage
{
get { return _NewMobileStorage; }
set { _NewMobileStorage = value; }
}

public void Read()
{
this.NewMobileStorage.Rd();
}
public void Write()
{
this.NewMobileStorage.Wt();
}
}








实现
static void Main(string[] args)
{
//多态性,把各种移动存储设备都看做 IMobileStorage,符合面向接口编程的思想
Computer computer = new Computer();
IMobileStorage flashDisk = new FlashDisk();
IMobileStorage hardDisk = new MobileHardDisk();

//插入闪存
computer.USBStorage = flashDisk;
computer.WriteData();
//插入移动硬盘
computer.USBStorage = hardDisk;
computer.ReadData();
computer.WriteData();

Console.WriteLine("==========================");
//新的设备由于方法名不一样,所以通过一个“适配器”来转化
StorageAdapter adapter = new StorageAdapter();
adapter.NewMobileStorage = new NewStorage();
computer.USBStorage = adapter;
computer.ReadData();
computer.WriteData();
Console.Read();
}
兔子-顾问 2012-08-25
  • 打赏
  • 举报
回复
打个比方
某项目经理对人力资源说:请给我招聘一个c#程序员
人力资源的根据“c#程序员”定义的标准和要求,找到了一个“人”,让项目经理面试。
你认为这个返回的是“人”,所以不符合“c#程序员”这个标准么?
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
2.函数不是要求返回接口吗public IList<string>? 为什么返回的是List<string> ?[/Quote]

深入理解继承和多态,你才能对面向对象系统分析和设计技术入门。如果你不理解“概念的扩展”形式,那么你只能人云亦云。比如说“白马也是马”,“老婆是个女人”,如果连这个类型扩展基本形式在编程上的表现都不懂,那么就等于是编程上的两岁儿童,而不是一个程序设计师。
li2422121715 2012-08-25
  • 打赏
  • 举报
回复
比如,在http协议里,你请求了一个动态文件news.aspx,通过反射建立一个news类,这个类就需要转化为接口IHttpHandle,从而实现接口里的方法。
缪军 2012-08-24
  • 打赏
  • 举报
回复
1.接口到底是什么东西,该什么时候用
a)接口的本质就是:声明和实现分离
b)对于程序员来说,很多时候是实现接口和使用接口,而不是设计接口
2.函数不是要求返回接口吗public IList<string>? 为什么返回的是List<string> ?
接口也是类型,可以返回其他任何继承了IList的类型的实例
hawkmsg 2012-08-24
  • 打赏
  • 举报
回复
9楼回答的很详细。
public IList<string> GetShipCountries()
{
OrderDAL orderDAL = new OrderDAL();
List<string> countries =new List<string>();
//如果更改为IList<string> countries =new List<string>();也许更好。
依赖倒转原则中,提到要面向接口编程,不要面向实现编程。
wrost 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
IList<> 泛型接口 而List<>则实现了该接口
接口:

C# code


interface IYouYong
{
void Method();
}
class Person:IYouYong
{
void Method()
{

}
}

然后我们可以这样去定义个接口变量【用该接口的实现类(这里就是Person)进行初始化……
[/Quote]


谢谢你的例子
wrost 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
接口是规范代码 降低藕度

继承接口都类都有了限制这样能做到规范

代码规范后就不容易出现冗余的代码。不过。当然不是什么地方都用接口用不好程序越来越难理解
[/Quote]

请问,大哥你一般什么时候用?
wrost 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
问题:
1.接口到底是什么东西,该什么时候用
2.函数不是要求返回接口吗public IList<string>? 为什么返回的是List<string> ?

回答:
1.接口是一个定义的规范,是一个抽象的概念,没有具体的实现。大型项目时,一般先定义系统功能所需要的接口,在JAVA或C#中,主要是用于解决类不能多继承的问题来设计的,用了接口就可以实现多继承(类只能继承一个,而接口可以实……
[/Quote]

又多理解了点。 多继承 里氏替换

谢谢,看来我要在实际应用在再好好体会

杰拉尔 2012-08-24
  • 打赏
  • 举报
回复
接口是规范代码 降低藕度

继承接口都类都有了限制这样能做到规范

代码规范后就不容易出现冗余的代码。不过。当然不是什么地方都用接口用不好程序越来越难理解
wrost 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
1.接口定义了一些行为,是一种约定,实现接口的类,必须提供提供这些行为。
[/Quote]

有一点点理解
hejiasoft 2012-08-24
  • 打赏
  • 举报
回复
接口定义的是行为,LIST<STRING>来实现ILIST<STRING> 。可以去看看接口和继承这一块的内容 ,属于C#基础知识。
Gemini Dean 2012-08-24
  • 打赏
  • 举报
回复
看来还是云里雾里,只有实践了才会有更深的理解
全栈极简 2012-08-24
  • 打赏
  • 举报
回复
问题:
1.接口到底是什么东西,该什么时候用
2.函数不是要求返回接口吗public IList<string>? 为什么返回的是List<string> ?

回答:
1.接口是一个定义的规范,是一个抽象的概念,没有具体的实现。大型项目时,一般先定义系统功能所需要的接口,在JAVA或C#中,主要是用于解决类不能多继承的问题来设计的,用了接口就可以实现多继承(类只能继承一个,而接口可以实现很多个)。
2.List<string>实现了IList<string>接口,或者说List<string>是IList<string>的“子类”,这就是“里氏替换”原则,也就是说父类出现的地方,子类一定可以出现。
yufei_yuxuan 2012-08-24
  • 打赏
  • 举报
回复
接口是一种约束,也是一个父类,在父类代替子类做事中,接口作用就很大了,很多设计都源于此
天下如山 2012-08-24
  • 打赏
  • 举报
回复
IList<> 泛型接口 而List<>则实现了该接口
接口:

interface IYouYong
{
void Method();
}
class Person:IYouYong
{
void Method()
{

}
}

然后我们可以这样去定义个接口变量【用该接口的实现类(这里就是Person)进行初始化】
IYouYong subject=new Person();
subject.Method();
isjoe 2012-08-24
  • 打赏
  • 举报
回复
当你需要行为和规范的时候,可定义接口

加载更多回复(11)

110,534

社区成员

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

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

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