读书人

对于接口不太懂得

发布时间: 2012-09-22 21:54:54 作者: rapoo

对于接口不太理解
public IList<string> GetShipCountries() 中 IList是表示接口对吧


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


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

谢谢



C# code
        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;        }


[解决办法]

2. 因为List<string>实现了 IList<string>?
[解决办法]
1.接口定义了一些行为,是一种约定,实现接口的类,必须提供提供这些行为。
[解决办法]
继承了接口实现.是属于它的子类.
[解决办法]
建议随便找一本C#书,读一下继承和接口相关章节,这是最基本的。
[解决办法]
List<string>是IList<string>的一个具体子类,可以参考"协变和逆变"的关系.接口就是定义了一组行为,然后由子类去实现它.
[解决办法]
当你需要行为和规范的时候,可定义接口


[解决办法]
IList<> 泛型接口 而List<>则实现了该接口
接口:
C# code
interface IYouYong{   void Method();}class Person:IYouYong{  void Method()  {      }}然后我们可以这样去定义个接口变量【用该接口的实现类(这里就是Person)进行初始化】IYouYong  subject=new Person();subject.Method();
[解决办法]
接口是一种约束,也是一个父类,在父类代替子类做事中,接口作用就很大了,很多设计都源于此
[解决办法]
问题:
1.接口到底是什么东西,该什么时候用
2.函数不是要求返回接口吗public IList<string>? 为什么返回的是List<string> ?

回答:
1.接口是一个定义的规范,是一个抽象的概念,没有具体的实现。大型项目时,一般先定义系统功能所需要的接口,在JAVA或C#中,主要是用于解决类不能多继承的问题来设计的,用了接口就可以实现多继承(类只能继承一个,而接口可以实现很多个)。
2.List<string>实现了IList<string>接口,或者说List<string>是IList<string>的“子类”,这就是“里氏替换”原则,也就是说父类出现的地方,子类一定可以出现。
[解决办法]
看来还是云里雾里,只有实践了才会有更深的理解
[解决办法]
接口定义的是行为,LIST<STRING>来实现ILIST<STRING> 。可以去看看接口和继承这一块的内容 ,属于C#基础知识。
[解决办法]
接口是规范代码 降低藕度

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

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

[解决办法]
9楼回答的很详细。
public IList<string> GetShipCountries()
{
OrderDAL orderDAL = new OrderDAL();
List<string> countries =new List<string>();
//如果更改为IList<string> countries =new List<string>();也许更好。
依赖倒转原则中,提到要面向接口编程,不要面向实现编程。

------解决方案--------------------


1.接口到底是什么东西,该什么时候用
a)接口的本质就是:声明和实现分离
b)对于程序员来说,很多时候是实现接口和使用接口,而不是设计接口
2.函数不是要求返回接口吗public IList<string>? 为什么返回的是List<string> ?
接口也是类型,可以返回其他任何继承了IList的类型的实例
[解决办法]
不大懂,我是初学者,感觉很迷茫
[解决办法]

探讨
1.接口定义了一些行为,是一种约定,实现接口的类,必须提供提供这些行为。

[解决办法]
探讨
接口定义的是行为,LIST<STRING>来实现ILIST<STRING> 。可以去看看接口和继承这一块的内容 ,属于C#基础知识。

[解决办法]
你可以这么理解,某个门呢,只有人能进去。
然后呢,大人可以进,小孩可以进,黑人可以进,白人也可以进;
但是呢,狗是不能进的。

仔细想想
[解决办法]
接口要跟类区分开来

比如机器猫让他继承猫类,孙悟空继承猴类

他们都有同一个方法,叫做变东西,

这时就需要一个定义一个接口来变东西

[解决办法]
好东西,先MARK一下,有时间研究一下
[解决办法]
打个比方
某项目经理对人力资源说:请给我招聘一个c#程序员
人力资源的根据“c#程序员”定义的标准和要求,找到了一个“人”,让项目经理面试。
你认为这个返回的是“人”,所以不符合“c#程序员”这个标准么?
[解决办法]
C# code
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();        } 


[解决办法]
接口:
1、约束
2、解决多继承的问题
3、可以看作是父类
[解决办法]
比如,在http协议里,你请求了一个动态文件news.aspx,通过反射建立一个news类,这个类就需要转化为接口IHttpHandle,从而实现接口里的方法。
[解决办法]

探讨
2.函数不是要求返回接口吗public IList<string>? 为什么返回的是List<string> ?

读书人网 >C#

热点推荐