正文

C#Doorstep2面向对象程序设计篇42008-04-03 16:31:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/33898.html

分享到:

结构

一个类中的若干成员可以组合成结构体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 Main()

        {

            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();

        }

    }

}

 

2.面向对象的基本特征

类的继承 

继承是面向对象程序设计的一个重要特征,它允许在现有类的基础上创建新类,新类从现有类中继承类成员,而且可以重新定义或加进新的成员,从而形成类的层次或等级。一般称被继承的类为基类或父类,而继承后产生的类为派生类或子类。

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 Main()

    {

        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)

阅读(2660) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册