zoukankan      html  css  js  c++  java
  • volcanol的工控博客

      今天这里讨论一下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.

           欢迎转载本系列文章,转载请注明来源。

  • 相关阅读:
    P2280 [HNOI2003]激光炸弹[前缀和]
    P1280 尼克的任务[区间覆盖dp]
    P1352 没有上司的舞会[树形dp]
    HDU1024 Max Sum Plus Plus[DP]
    P1282 多米诺骨牌[可行性01背包]
    P1063 能量项链[区间DP]
    P1880 [NOI1995]石子合并[环形DP]
    P1091 合唱队形[单调性+DP]
    Gym 100971D 单调栈
    Gym 100971A Treasure Island BFS 思维题
  • 原文地址:https://www.cnblogs.com/volcanol/p/5427808.html
Copyright © 2011-2022 走看看