Visual C#.NET之面向对象程序设计进阶

一、类的继承:C#语言提供了两种实现继承的方式:类的继承和接口继承。通常把作为基础、被继承的类称为基类,继承别的类的子类称为派生类。一个类从另一个类派生出来时,派生类从基类那里继承特性。派生类也可以作为其他类的基类。C#中,派生类只能从一个类中继承,不支持多继承的机制。如果必须使用多重继承,可以使用接口继承来实现。

1、基类与派生类

实际上,每个类的生命都在隐式的继承System.Object类,通常所讲的继承是指显式的继承。在语法上,继承是在类的声明中同时完成的。在类名称标识符后面加上冒号“:”,冒号后面是基类,因为只有单继承,所以基类只有一个。C#中,派生类可以从它的直接基类中继承的成员有:方法、域、属性、事件、索引器,除了构造函数和析构函数,派生类隐式地继承了直接基类的所有成员。

2、base关键字

base 和this在C#中被归于访问关键字,顾名思义,就是用于实现继承访问机制的访问操作,来满足对对象成员的访问,从而为多态机制提供更加灵活的处理方式。 base关键字的功能如下:1)调用base访问基类的字段和方法。调用被隐藏的基类的成员,必须使用base关键字。2)使用base关键字调用基类的构造函数。3)使用base的注意点:①base和this一样是指对象,因此不能用在静态方法和静态构造函数中,也不能通过base和this访问其他静态成员。②直接基类也可以是派生类,直接基类中拥有来自它自己的基类成员,派生类中使用base关键字不区分直接基类成员的来源,都同样使用base来访问。③派生类使用base只能调用直接基类的构造函数。④只能在派生类中用base访问基类的被隐藏的成员,在派生类外,不能通过派生类的对象访问被隐藏的成员。

二、抽象类与封闭类:抽象类用关键字abstract修饰,封闭类用关键字sealed修饰,在继承性上,抽象类和封闭类的作用相反。

1、用abstract修饰的方法、属性和索引器分别称为抽象方法、抽象属性和抽象索引器。它们的共同特点是只有行为的定义,却没有行为的实现。抽象方法是只有方法头,没有方法体的方法。抽象方法的声明格式为:abstract 返回类型 方法名(参数列表)

在用到abstract关键字时,需要注意以下几点:①abstract不能和static同时修饰同一个方法。②abstract不能和private同时修饰同一个方法,并且不能省略访问控制符。③abstract方法只能出现在abstract类中,并且只有当包含此抽象方法的抽象类被继承之后,才能在派生类中被实现。④派生类实现抽象方法时必须使用关键字override,否则被默认为是默认的关键字new。

2、抽象类,用关键字abstract修饰的抽象类是一种没有被完整定义的类,因此不能用来实例化,也就是说,不能产生对象。设计abstract类的目的是为了被继承,其意义在于:①包含派生类的公有成员。②规范行为。抽象类的声明格式:abstract class 类名 {……}。设计抽象类时要注意:①抽象类虽然不能产生对象,但可以有构造函数。②抽象类是要被继承的,所以不能和sealed修饰符联用。③抽象类的派生类可以依然是抽象类,只有当派生类实现了所有抽象成员后,才演化为一个普通的类,这时才能产生对象。

三、多态

1、虚成员:类中用关键字virtual修饰的成员称为虚成员,虚成员有虚方法、虚属性和虚索引器。在类的某些成员(如方法、属性和索引器)声明前加上了virtual修饰符后,不能再有abstract、static或override。

2、重写,又称覆盖。对于基类的virtual成员,在派生类中重新定义称为重写或覆盖。重写需要使用关键字override。下面给出通过虚成员中的虚方法和虚方法重写实现多态的具体实例。

public class Employee
    {
        public string name;
        public double salary;
        public double increase;
        public Employee(string n, double m)  //构造函数
        {
            name = n;
            salary = m;
        }
        public void Print()
        {
            Console.WriteLine("Name:{0}", name);
            Console.WriteLine("Salary:{0:c}", salary);
            Console.WriteLine("Increase:{0:c}", increase);
        }
        public virtual void Raise(double percent) //声明虚方法
        {
            increase = salary * percent;
        }
    }
    public class Normal : Employee //定义Employee的派生类Normal
    {
        public Normal(string n, double m)
            : base(n, m)
        { }
        public override void Raise(double percent)//重写基类Employee的虚方法Raise
        {
            Console.WriteLine("普通员工的工资情况");
            increase = percent * salary;
        }
    }
    public class Bachelor : Employee//定义Employee的派生类Bachelor
    {
        public Bachelor(string n, double m)
            : base(n, m)
        { }
        public override void Raise(double percent)//重写基类Employee的虚方法Raise
        {
            Console.WriteLine("大学生员工的工资情况");
            base.Raise(percent);
            increase = 2 * increase;
        }
    }
    public class Master : Employee//定义Employee的派生类Master
    {
        public Master(string n, double m)
            : base(n, m)
        { }
        public override void Raise(double percent)//重写基类Employee的虚方法Raise
        {
            Console.WriteLine("研究生员工的工资情况");
            base.Raise(percent);
            increase = 3 * increase;
        }
    }
    public class Test
    {
        public static void Main()
        {
            Normal N = new Normal("Mary", 500);
            N.Raise(0.05);
            N.Print();
            Bachelor B = new Bachelor("John", 700);
            B.Raise(0.05);
            B.Print();
            Master M = new Master("Smith", 1000);
            M.Raise(0.075);
            M.Print();
            Console.ReadKey();
        }
    }

QQ图片20160623212441.png

3、编译时多态:在编译时就能确定调用对象中的成员,也称为早绑定。隐藏、重载都属于早期绑定,即编译时多态。运行时多态:只有当运行时才能确定调用哪个对象中的成员,又称为晚绑定。虚方法、重写是晚绑定,即运行时多态。一般所说的多态性均为运行时多态。

四、接口:一些实现特定功能的抽象成员的集合,这些抽象成员可以是抽象方法、属性、索引器、事件,接口是实现多继承的工具。一个类可以继承多个接口,从而获得多个行为的描述,将它们组合成新的功能并在类中实现。接口的声明格式:【接口修饰符】interface 接口名:【基接口列表】{接口体} 其中:接口修饰符有:new、public、protected、internal、private。接口名是一个标识符,首字母为大写的I。“:”表示继承,接口可以多继承。接口成员一定是抽象的。接口方法默认的访问修饰符是public的。接口的实现形式:class 类名:【基类】,接口,接口,……,接口{……//成员定义部分} 注意:在类中实现的接口成员(方法、属性、索引和事件)必须定义为public。

五、委托和事件:委托(Delegate)类型完全是面向对象的,封装了对象实例和方法。事件是指当对象发生某些事情时,向其他对象提供通知的一种方法。在C#中,事件是通过委托实现的。

1、委托:任何对象中的方法都可以通过委托动态地调用,只要方法的参数类型和返回类型与委托的参数类型和返回类型严格匹配。委托类型的声明格式为:【修饰符】delegate 类型说明符 委托名(【参数列表】);其中修饰符有:new、public、internal、protected和paivate。

2、多播:一次委托可以调用多个方法,称为多播,也称委托组合。通过“+”和“-”运算符实现多播的增加和减少。

3、事件,使用事件的大致过程包括以下步骤:①创建或声明一个委托。②声明事件。③声明事件发生时处理的方法。④将事件与委托关联起来。⑤调用事件。事件的声明格式:【修饰符】event 委托类型 事件名;其中:修饰符可以是abstract、new、override、static、virtual、extern和public、protected、internal、private 4个访问修饰符的有效组合。委托类型是封装了事件处理方法的委托类型。注:“+=”将方法注册到事件,“-=”移除事件处理程序的委托。

three words:①事件声明时指明与哪些委托相关联;②委托方法提前注明到事件中;③触发事件,委托执行(方法)。

六、异常处理

捕获处理异常:①try-catch:可有一个或多个catch块语句的try块语句。②try-finally:跟有一个finally块语句的try块语句。③try-catch-finally:跟有一个或多个catch块语句和一个finally语句的try块语句。catch用于处理语句块中出现的异常,catch的格式是:catch (class-type 标识符)。

学习来源:《Visual C#.NET实用教程》清华大学出版社 主编:师硕、于明。学习资料:面向对象程序设计进阶.rar

标签:

发表评论: