在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天这里讨论一下Delphi中的面向对象编程,这里不做过多过细的讨论,主要做提纲挈领的描述,帮助自己抓做重点。 本随笔分为两部分: 一、面向对象编程 二、面向对象编程详细描述 ------------------------------------------ 一、面向对象编程 下面是工程文件的: { 面向对象编程基础 1、class的定义/类的定义 2、构造函数 3、析构函数 4、封装 5、继承 } program oop; {$APPTYPE CONSOLE} uses SysUtils, Unit1 in 'Unit1.pas'; var //定义一个类实例,或者说定义一个类对象 admin:TPersonMan; begin { 对象的使用 1、 使用对象之前必须用构造函数创建对象 2、 对象的构造函数是为Create方法 3、 对象构造的时候,必须用类型名,因为这个时候对象还没有,所以不能 用对象实例的名字 4、 对象的析构,必须用 对象的实例名称 } //实例化对象,访问对象前必须实例化对象 admin := TPersonMan.Create(); //访问对象的域 admin.id := 512109051; admin.strName := 'volcanol'; //访问对象的方法,可以省略(), 最好不要省略,因为不省略的话可以明确的表示 //访问的是对象的方法 admin.playFootball(); //Delphi的Object Pascal和 Java 、C#这样具有自动垃圾回收机制的语言不一样 //Object Pascal需要自己回收垃圾, 即在对象不再需要使用的时候,需要将对象 //的空间进行回收, 通过 Free() 方法和 Destroy() 方法实现,通常Free()方法 //更加的安全。 admin.Free(); //admin.FreeInstance(); ReadLn; end. 下面是单元文件unit1: { class类的定义 1、class关键字 2、封装 3、继承 4、构造函数 5、析构函数 } unit Unit1; interface uses SysUtils; type { 定义一个类 1、下面三种方式一样 // 1、方式1 TPerson=class(TObject) end; //方式2: TPerson=class end; //方式3 TPerson=class; 方式1、 明确的类的父类, 通过在关键字class后面利用 (父类名称)来完成 方式2、 在Delphi的Object Pascal中所有的类都一个共同的祖先类 TObject, 这个 TObject 类,相当于盘古或者女蜗一样。 方式3、 方式3和方式2一样,只是省略了关键字 end,注意只有在定义的类型 的时候 end 关键字可以省略,其他的时候不能省略。 要点: 1、如果用方式2定义则必须定义至少一个域,否则编译报错, 报错类容为: TPerson 未完全定义。 2、如果用方式3定义,则必须显式的指出类的父类型 Type TxxxObject=class(TObject); //正确的定义方法 } { Type TxxxObject=class; //编译报错,类型没有定义完全。 } TPerson=class //类的域定义, 注意Delphi中Object Pascal的域 id:integer; //对象的封装,但是这里没有完全体现封装的真正“意义”。 end; TPersonMan=class(TPerson) //演示继承类的定义方法 strName:shortString; //下面的两种声明方法的方式需要注意都可以,一般推荐使用第一种方式 //因为这样更能表示这是一个方法。 procedure playFootball(); //procedure playFootBall; end; implementation { 类方法的实现 1、 和普通的方法一样,类的方法也需要在实现中进行定义,否则将不能调用 2、 注意定义类的方法的时候,需要指定方法属于哪一个类," . " 域操作符 来实现。 类名.方法名 } procedure TPersonMan.playFootball; begin WriteLn('I can play football :) !!!'); end; end.
二 面向对象编程 下面的工程对面向对象编程进行了更多的描述。 下面是工程文件: { 面向对象详细 1、方法特性 static、virtual、dynamic、message 2、访问特性控制: private、public、 3、域的 "属性" 特性 } program OopDetail; {$APPTYPE CONSOLE} uses SysUtils, Unit1 in 'Unit1.pas'; var //定义两个对象 person:TPerson; teachar1:TTeachar; begin //实例化变量 person :=TPerson.Create(); //初始化域 person.gender := Male; person.name := 'volcanol'; person.height := 1.75; person.weight := 68; person.nationality := China; person.education := Primary; person.profession := Unemployment; //方法 person.eat(); person.language(); person.playBall(); WriteLn(''); //实例化对象 teachar1 := TTeachar.Create(); //初始化域 teachar1.gender := Female; teachar1.name := 'Lily'; teachar1.height := 1.65; teachar1.weight := 50; teachar1.nationality := England; teachar1.education := University; teachar1.profession :=Teachar; { 方法 1、注意调用 override 的方法的输出 } teachar1.language(); teachar1.playBall(); teachar1.teaching(); teachar1.prepareLesson(); teachar1.testLesson(); ReadLn; end. 下面是单元文件: { class man 的定义 1、定义一个人的基类 2、基类的方法具有static、virtual、dynamic、message } unit Unit1; interface uses SysUtils; type //定义一个表示性别的枚举类型 TGender=(Male,Female); //定义一个表示国籍的枚举类型 TNation=(China,England,American); //定义一个表示学历的枚举类型 TEducation=(Primary,Junior,Senior,University); //定义一个职业的枚举类型 TProfession=(Unemployment,Teachar,Docotor,Lawyer,Firefight); //**************************************************** // 定义一个人的类 // 1、人的属性 --- 域 // 性别、姓名、身高、体重、国籍、学历等 // 2、人的能力 --- 方法 // 外语、吃饭、打球等 //***************************************************** TPerson=class // 域 gender : TGender; name : shortstring; height : single; weight : single; nationality : TNation; education : TEducation; profession: TProfession; // 方法 //静态方法 静态方法不能被覆盖 procedure eat(); //虚方法 父类的虚方法可以在子类中被覆盖 procedure language(); virtual; procedure playBall(); virtual; end; TTeachar=class(TPerson) //域 // 方法 { 方法的覆盖: 1、 通过 override 关键字表示 2、方法的覆盖就是屏蔽父类的同名方法,注意与方法的重载 overload 的 区别 3、 } procedure language(); override; procedure playBall(); override; procedure teaching(); procedure prepareLesson(); procedure testLesson(); end; implementation //*********************************************************** // 实现 TPerson类的方法 procedure TPerson.eat(); begin WriteLn('I can eating.'); end; procedure TPerson.playBall(); begin WriteLn('I can play ball.'); end; procedure TPerson.language(); begin WriteLn('I can only speak one languave.'); end; //*********************************************************** // 实现 TTeacher 类的方法 procedure TTeachar.language(); begin WriteLn('I can speak lot of languave.'); end; procedure TTeachar.playBall(); begin WriteLn('I can not play ball.'); end; procedure TTeachar.teaching(); begin WriteLn('I am a Chinese teachar.'); end; procedure TTeachar.prepareLesson(); begin WriteLn('I am prepare math lesson.'); end; procedure TTeachar.testLesson(); begin WriteLn('I am testing English.'); end; end.
欢迎转载本系列文章,转载请注明来源。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论