abstract class Bird { protected string name; public abstract string Name { get; set; } public abstract string GetName(); } class Eagle : Bird { public Eagle(string name) { this.name = name; } public override string Name { get { return name;//throw new NotImplementedException(); } set { name = value;//throw new NotImplementedException(); } } public override string GetName() { //Console.WriteLine(Name);//throw new NotImplementedException(); return Name; } public Eagle[] _eagle = new Eagle[10]; public Eagle this[int index] { get { return _eagle[index]; } set { _eagle[index] = value; } } }
客户端调用代码:
class Program { static void Main(string[] args) { Eagle eagle = new Eagle("我是一只老鹰呀!"); Console.WriteLine(eagle.GetName()); //eagle._eagle[0] = new Eagle("wo shi yi zhi xiao xiao niao"); //Console.WriteLine(eagle._eagle[0].GetName()); eagle[0] = new Eagle("wo bu gu dan!"); eagle[1] = new Eagle("wo shi yi zhi xiao xiao niao"); Console.WriteLine(eagle[0].GetName()+" "+eagle[1].GetName()); Console.Read(); } }
汗,先前对索引器的用法弄错了,直接是在客户端实例化类对象后调用类的Eagle型实体变量_eagle[0]并进一步进行实例化存储在数组里,不是基于索引器的调用,查了下msdn的帮助稍作修改,现在把索引器的相关用法写下来:
1.索引器允许您按照与数组相同的方式对类、结构或接口进行索引,要声明类或结构上的索引器,请使用 this 关键字。
2.索引器类型及其参数类型必须至少如同索引器本身一样是可访问的。
3.索引器的签名由其形参的数量和类型组成。它不包括索引器类型或形参名。如果在同一类中声明一个以上的索引器,则它们必须具有不同的签名。
4.索引器值不属于变量;因此,不能将索引器值作为 ref 或 out 参数进行传递。
5.C# 并不将索引类型限制为整数。例如,对索引器使用字符串可能是有用的。通过搜索集合内的字符串并返回相应的值,可以实现此类的索引器。由于访问器可被重载,字符串和整数版本可以共存。