接口、索引器、Foreach的本质(学习笔记)
接口
什么是接口?
接口代表一种能力,和抽象类类似但比抽象类的抽象程度更高!
接口的定义:
public interface IEat//定义一个接口
{
void Eat(string food);//为该接口定义一种能力
}接口的定义
从上边的例子中我们可以看到,接口中的方法是没有方法体的甚至连访问修饰符都没有。而且在接口中只能有方法、属性、索引器及事件!
接口的使用:
public class
Dog:IEat //Dog类实现IEat接口
{
//Dog类实现IEat接口的Eat方法
public void Eat(string food)
{
Console.WriteLine("吃"+food);
}
}
接口的使用
注意:如果一个类实现了一个接口则该类必须实现该接口及其父接口的所用方法除非该类是一个抽象类则交由该类的子类来实现!一个接口也可以继承另一个接口而不实现该接口的方法而是交由其实现者来实现
Demo:
//接口一
public Interface IEat
{
void Eat();
}
//接口二
public Interface Ipaly
{
void Play();
}
//接口三
public Interface Itravel:IEat,Ipaly
{
//接口三继承接口一和接口二
} public class program:Itravel
{
public void Eat()
{
//省略方法体
}
public void Play()
{
//省略方法体
}
}Mode
从上面的demo中一些可以看到Itravel接口继承的IEat接口和Ipaly接口可能有些朋友要问了”在C#以及JAVA中不是不支持多继承吗?”
注意这句活是针对类而言的,但针对接口来说一个类是可以实现多个接口的同样一个接口也可以继承多个接口
接口和抽象类的区别:
当需要的各个对象之间存在父子类关系时,可以考虑使用抽象类,
当各个对象之间不存在继承关系,只是有相同的能力时,而已考虑使用接口
抽象类是某一类事物的抽象结果而接口则代表某些事物的一种能力
接口的注意点:
01.接口就是为了约束方法的格式(参数和返回值类型)而存在的
02.接口可以实现多继承,弥补单继承的缺陷。
03.接口可以看成是一个特殊的抽象类,通过反编译看源码可知
04.接口中方法不用访问修饰符,因为CLR会自动添加,并且不能有方法体
05.如果一个类实现了某个接口,就得实现该接口中所有的方法
06.接口要谨慎使用,防止出现接口污染!
07.接口仅仅代表一种能力,实现该接口的类和接口没有继承关系
08.接口是用来实现的,类是用来继承的。
09.其实很多时候,看似可以不用接口,因为接口就是一个方法的约定,
10.抽象类也可以实现接口,但接口成员必须映射到抽象类的抽象成员。抽象类的派生类如果是非抽象类,则必须通过方法重载来实现接口成员
索引器
为什么要使用索引器?
解析:当一个类中包含数组或集合成员时使用索引器可以大大简化度数组或集合成员的存取操作。
索引器的定义
索引器的定义和属性类似
/*[修饰符] 数据类型 this[索引类型 index]
{
get{//获得属性的代码}
set{ //设置属性的代码}
}
*/索引器的定义语法
demo:
public class Students
{
string[] names = new string[3];
public string this[int index] {
get{return names[index];}
set{names[index]=value;}
}
int[] age = new int[3];
public int this[string Key]
{
get {
for (int i = 0; i < names.Length;i++ )
{
if (Key.Equals(names[i]))
{
return age[i];
}
}
return -1;
}
set
{
for (int i = 0; i < names.Length; i++)
{
if (Key.Equals(names[i]))
{
age[i]=value;
}
}
;
}
}
}
demo
Foreach的本质:
为什么数组和集合可以用Foreach遍历?
解析:因为数组和集合都实现了IEnumerable接口,该接口只有一个方法GetEnumerator()所以只要实现了IEnumerable接口的类都可以被Foreach遍历
// 摘要:
// 公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。
[ComVisible(true)]
[Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
{
// 摘要:
// 返回一个循环访问集合的枚举数。
//
// 返回结果:
// 一个可用于循环访问集合的 System.Collections.IEnumerator 对象。
[DispId(-4)]
IEnumerator GetEnumerator();
}IEnumerable原型
从上面代码中我们可以看到IEnumerable接口的GetEnumerator()方法返回一个实现了IEnumerator接口的对象!
// 摘要:
// 支持对非泛型集合的简单迭代。
[ComVisible(true)]
[Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
{
// 摘要:
// 获取集合中的当前元素。
//
// 返回结果:
// 集合中的当前元素。
object Current { get; } // 摘要:
// 将枚举数推进到集合的下一个元素。
//
// 返回结果:
// 如果枚举数成功地推进到下一个元素,则为 true;如果枚举数越过集合的结尾,则为 false。
//
// 异常:
// System.InvalidOperationException:
// 在创建了枚举数后集合被修改了。
bool MoveNext();
//
// 摘要:
// 将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
//
// 异常:
// System.InvalidOperationException:
// 在创建了枚举数后集合被修改了。
void Reset();
}IEnumerator原型
当我们使用Foreach遍历一个对象时会先执行该队形的GetIEnumerable方法得到一个迭代器(实现的IEnumerator接口的对象),然后调用给对象的Reset方法来初始枚举数,然后执行该对象的MoveNext()方法得到Bool值如果该方法返回真则调用该对象的Current属性得到值在执行MoveNext()方法直到该方法返回假则退出迭代
Demo:
//可供Foreach遍历的类(实现了IEnmerable接口)
public class MyList:IEnumerable
{
ArrayList list = new ArrayList();
public void Add(object o)
{
list.Add(o);
}
public IEnumerator GetEnumerator()
{
return new MyIenumerator(list);
}
}
//实现了IEnumerator接口的类
public class MyIenumerator:IEnumerator
{
public MyIenumerator(ArrayList list)
{
this.list = list;
}
ArrayList list = new ArrayList();
int I = -1;
public object Current
{
get { return list[I]; }
} public bool MoveNext()
{
bool falg = false;
if (I<list.Count-1)
{
I++;
falg = true;
}
return falg;
} public void Reset()
{ }
}自定义可供foreach遍历的类
接口、索引器、Foreach的本质(学习笔记)的更多相关文章
- RESTful接口设计原则/最佳实践(学习笔记)
RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...
- java拦截器(Interceptor)学习笔记
1,拦截器的概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...
- PHP以接口方式实现多重继承(完全模拟)--学习笔记
1.UML类图: 2.PHP代码: <?php /** * Created by PhpStorm. * User: andy * Date: 16-11-23 * Time: 下午7:57 ...
- 【接口】【USB】1.学习笔记
1.USB的优点: 可以热插拔,即插上后可以自动识别: 系统总线供电,USB共有四根线,一根电源线,一根地线,一根D+线,一根D-线,D+和D-线是差分输入线: 可以支持多种设备,且扩展容易,通过HU ...
- JVM 类加载器ClassLoader源码学习笔记
类加载 在Java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的. 类型可以是Class,Interface, 枚举等. Java虚拟机与程序的生命周期 在如下几种情况下,Java虚拟机 ...
- C# 接口中的索引器
索引器可在 接口(C# 参考) 上声明.接口索引器的访问器与类索引器的访问器具有以下方面的不同: 接口访问器不使用修饰符. 接口访问器没有体. 因此,访问器的用途是指示索引器是读写.只读还是只写.以下 ...
- vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Directx11学习笔记【二十二】 用高度图实现地形
本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...
- Linux学习笔记——如何使用共享库交叉编译
0.前言 在较为复杂的项目中会利用到交叉编译得到的共享库(*.so文件).在这样的情况下便会产生下面疑问,比如: [1]交叉编译时的共享库是否须要放置于目标板中,假设须要放置在哪个文件 ...
随机推荐
- java1.8对集合中对象的特有属性进行排序
每天学习一点点,知识财富涨点点 1.创建对象user12 2.编写测试类 3.输出结果 加油!!!!
- C# 实现透明可移动窗体
1.设置窗体属性 this.BackColor this.TransparencyKey = this.BackColor; 2.窗体加载图片 this.BackgroundImage = globa ...
- hive2.0函数大全
Hive2.0函数大全(中文版) 摘要 Hive内部提供了很多函数给开发者使用,包括数学函数,类型转换函数,条件函数,字符函数,聚合函数,表生成函数等等,这些函数都统称为内置函数. 目录 数学函数 ...
- 【转自网络】JS实现保存当前网页HTML到本地
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python 对象初识
# Demo1class Penson: animal = 'big mom' plant = 'flower' def __init__(self,name,age,sex,job): self.n ...
- Firefox Quantum:开发者版本 推荐
为生民,不谋利 欢迎您使用 Firefox 开发者版本.使用此版本可获得最新功能.高速性能,以及您打造开放 Web 所需的开发工具. https://www.mozilla.org/zh-CN/fir ...
- 如何解决 不能以 DISTINCT 方式选择 text、ntext 或 image 数据类型
distinct去重,如果遇到text字段,可以用以下方法解决 1.用not exists select * from tab awhere not exists ( select 1 from t ...
- HTTP+XML接口客户端 结合策略模式实现总结
在项目中,我们经常会使用到http+xml的接口,而且不仅仅的是一个,可能会有多个http的接口需要实时的交互.但是http接口的发送消息的公共部分是一样的,只有每个接口的报文解析和返回报文是不同的, ...
- k8s集群启动了上万个容器(一个pod里放上百个容器,起百个pod就模拟出上万个容器)服务器超时,无法操作的解决办法
问题说明: 一个POD里放了百个容器,然后让K8S集群部署上百个POD,得到可运行上万个容器的实验目的. 实验环境:3台DELL裸机服务器,16核+64G,硬盘容量忽略吧,上T了,肯定够. 1.一开始 ...
- 百度图标echarts.js的使用
echarts官网:http://echarts.baidu.com/api.html#echarts echarts是百度公司开的一种开源制作图片工具,是一个专门制作图表的开源工具,功能非常强大,地 ...