C#语法相关(二)

索引器

索引器可以使类对象像数组似的使用,比如我定义了个类对象Apple apple,那么如果Apple类里声明了索引器,并且是int类型的话,我就可以这样访问:apple[0],apple[1],apple[2]..等,那么从apple[0]里读取到的是什么呢,这就得看你自己怎么定义set和get函数了,因为你也可以把这些“数组元素“看作一个个变量,而“数组索引”就是它们的区别。

先来看看索引器的声明:

public int this[int index]

上面第一个int表明这个对象“数组”是什么类型的,而this关键字是固定的,C++里,这个this是一个指针,它指向自身的对象,可以说是代表着对象。

那么这种this[int index]定义就可以看得清楚了,跟apple[0],apple[1]是对应的。

上面说了这么多,如果不看代码的话,我想也很难理解,不过这也没关系,因为上面这些只是为了更好的理解下面的代码,代码看的懂就算是成功了。

看例子:

using System;

class Apple

{

    public int this[int index]

    {

        set

        {

            Console.WriteLine("赋值{0},但实际并没有存储", value);

        }

        get

        {

            Console.WriteLine("我只是返回索引加10的数字,它是{0}", index + 10);

            return index + 10;

        }

    }

}

class Program

{

    static void Main(string[] args)

    {

        Apple apple = new Apple();

        apple[0] = 100;

        apple[1] = 50;

        int Num = apple[10];

        Num = apple[5];

    }

}

如果想存储值的话,在类里面定义一个相应的数组就可以了。

另外,索引的类型也可以是字符串,浮点型,字符。

看下例:

using System;

class Apple

{

    public int this[string str]

    {

        set

        {

            Console.WriteLine("赋值{0},但实际并没有存储,索引字符串:{1}", value,str);

        }

        get

        {

            Console.WriteLine("取值的索引字符串:{0}", str);

            return 100;

        }

    }

}

class Program

{

    static void Main(string[] args)

    {

        Apple apple = new Apple();

        apple["abcd"] = 100;

        apple["Trust"] = 50;

        int Num = apple["1234"];

        Num = apple["Thanks"];

    }

}

base关键字

在C++中,如果子类和父类有一个相同的函数,那么在子类中要调用父类的相同函数,可以在函数前加上类名,就是调用父类的函数了,子类构造函数中调用父类的构造函数也是如此。

先来回顾一下C++中是怎么调用的:

#include

class CFruit

{

public:

    CFruit()

    {

       cout<<"父类CFruit的构造方法被调用"<

    }

    void PutFruit()

    {

       cout<<"父类的PutFruit方法被调用"<

    }

};

    

class CApple:public CFruit

{

public:

    CApple()

       :CFruit()//CFruit()调用父类构造函数

    {

       cout<<"子类CApple的构造方法被调用"<

    }

    void PutFruit()

    {

       CFruit::PutFruit();//调用父类PutFruit函数

       cout<<"子类的PutFruit方法被调用"<

    }

};

int main(int argc, char* argv[])

{

    CApple apple;

    apple.PutFruit();

    return 0;

}

而c#中,差不多就是用base代替了父类名,如下:

using System;

class Fruit

{

    public Fruit()

    {

        Console.WriteLine("父类Fruit的构造方法被调用");

    }

    public void PutFruit()

    {

        Console.WriteLine("父类的PutFruit方法被调用");

    }

}

class Apple:Fruit

{

    public Apple()

        : base()//base()调用父类的构造方法

    {

        Console.WriteLine("子类Apple的构造方法被调用");

    }

    public void PutFruit()

    {

        base.PutFruit();//调用父类的PutFruit方法

        Console.WriteLine("子类的PutFruit方法被调用");

    }

}

class Program

{

    static void Main(string[] args)

    {

        Apple apple = new Apple();//构造方法被调用

        apple.PutFruit();//调用PutFruit方法

    }

}

另sealed关键字修饰的类不可以被继承。

看下面这个类:

sealed class Fruit

{

    public  void PutFruit()

    {

        Console.WriteLine("父类的PutFruit方法被调用");

    }

}

Fruit是不可以派生出其它类的。

partial关键字可以使类分开来定义。
看下例:
partial class Apple//partial关键字,分开定义。
{
    public void OutApple()
    {
        Console.WriteLine("OutApple()");
    }
}
partial class Apple
{
    public int Number = 100;
    public void OutNumber()
    {
        Console.WriteLine("{0}", Number);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Apple apple = new Apple();
        apple.OutApple();
        apple.OutNumber();
    }
}
分开来定义类的格式就是上面那样,只要用partial关键字修饰就行了。上面的局部类都是在同一个文件里,也可以写在不同的文件里。

你可能感兴趣的:(#,c#桌面编程,c#,c++,开发语言)