结构 
一个类中的若干成员可以组合成结构体struct来处理。
事件 委托等概念请见后面解析。
     C#的类定义中可以包含两种成员:静态成员和非静态成员(也即实例成员)。使用了static修饰符的方法为静态成员,反之则是实例成员。 
(1)使用static修饰符声明属于类型本身而不是属于特定对象的静态成员。static修饰符可用于字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类型。
(2)静态成员属于类,在内存中只有一份,不必建立该类的实例,通过类名即可使用;而实例成员属于用该类创建的实例,要通过对象名使用。
(3)非静态方法可以访问类中包括静态方法在内的所有成员,而静态方法只能访问类中的静态成员。
类的方法前加了static关键词,则该方法为静态方法,反之为实例方法。静态方法为类所有,可以通过对象来使用,也可以通过类来使用。但一般提倡通过类名来使用,因为静态方法只要定义了类,不需用建立类的实例就可使用。静态方法只能使用类的静态成员。
实例方法必须通过类的实例来使用。实例方法可以使用类的非静态成员,也可以使用类的静态成员。
using System;
namespace Exam2_4
{
    class Test
    {
        public int a;     
        //非静态成员
        public static int b;            //静态成员
        public Test(int m, int n)    //构造函数
        {
            a = m;
            b = n;
        }
        public void DMeth()        //非静态方法 
        {
            a = a + 5;
            b = b + 5;
        }
        public static void SMeth()        //静态方法 
        {
            //a=a+5;静态方法不能使用非静态成员
            b = b + 5;
        }
    }
    class Exam2_4
    {
        public static void 
        {
            Test t1 = new Test(5, 10);
            t1.DMeth();
            //t1.SMeth();//错误!静态方法只能由类调用
            Test.SMeth();
            //Console.WriteLine("t1.a={0},t1.b={1}",t1.a,t1.b);//错误!静态成员b属于类不属于对象
            Console.WriteLine("t1.a={0},Test.b={1}", t1.a, Test.b);//错误!静态成员b属于类不属于对象
            Console.Readkey();
        }
    }
}
  
继承是面向对象程序设计的一个重要特征,它允许在现有类的基础上创建新类,新类从现有类中继承类成员,而且可以重新定义或加进新的成员,从而形成类的层次或等级。一般称被继承的类为基类或父类,而继承后产生的类为派生类或子类。 
与C++不同的是C#中类不能多重继承,只能单一继承,C#中通过接口(interface)实现多重继承.
派生类的声明格式为:类修饰符 class 派生类类名: 基类类名 { 类体 }
在类的声明中,通过在类名的后面加上冒号和基类名表示继承。 
class Employee : Person
{
    private string department;
    private decimal salary;
    public Employee(string n, char s, int a, string d, decimal sa)
        : base(n, s, a)
    {
        department = d;
        salary = sa;
    }
    new public void Display()
    {
        base.Display();
        Console.WriteLine("Department:{0}", department);
        Console.WriteLine("Salary:{0}", salary);
    }
}
class Exam2_8
{
    public static void 
    {
        Person p = new Person("李红", '女', 28);
        Employee e = new Employee("田春妹", '女', 24, "办公室", 2500);
        Person q = e;    //基类变量可以存储派生类对象
        p.Display();
        e.Display();
        q.Display();   //调用的是基类的Display()方法
    }
}

结果分析:
现在我们来看以上实例中类的实例化:
<1>Person p = new Person("李红", '女', 28);此句声明一个基类Person的实例,p.Display()将调用基类Person的成员函数。
<2>Employee e = new Employee("田春妹", '女', 24, "办公室", 2500); 此句声明一个基类Person的派生类Employee的实例,e.Display()将调用派生类Employee的成员函数。
<3>Person q = e;此处用基类Person的派生类Employee的实例来实例化基类Person,则对象q只保留基类特性,q.Display()将调用基类Person的成员函数。
(To be continued)

评论