//抽象方法类似与接口; 在没有接口的年代 Delphi 是用抽象方法来模拟接口的; 我想它最终会被接口替代.

{下面就定义了两个抽象方法}
TMyClass = class(TObject)
  procedure Proc1; virtual; abstract;      {抽象方法首先应该是一个虚方法或动态方法}
  function Fun: string; dynamic; abstract; {抽象方法也叫纯虚方法}
end; {
  抽象方法在本类中只有定义、没有实现;
  抽象方法应该在子类中实现.   如果一个类包含了抽象方法, 那么这个类也就成了抽象类;
  抽象类只能通过其子类来实例化, 自己不能生成对象.   最常用的一个抽象类应该是 TStrings 了, 举例:
}
var
  List: TStrings;
  i: Integer;
begin
  List := TStringList.Create;   for i := to do List.Add(IntToStr(i));   Memo1.Lines := List;   List.Free;
end; {
  TStrings 类中包含了抽象方法, 但这些抽象方法在其子类 TStringList 中都得到了实现;
  因此, 我们虽然定义的是 TStrings 类的变量, 却要通过 TStringList 来实现.   这里就有个问题, 我们直接使用 TStringList 不行吗? 为什么还要绕个弯?
  我觉得是: 这样才更符合"多态"的思想吧;
  仅就本例而言 Memo1.Lines 本身就是 TStrings 类型的, 这样可以避免类型冲突. 举例说明:
}
//这是个错误的例子
var
  List: TStringList; {如果定义为 List: TStrings 可消除错误}
begin
  List := TStringList.Create;   List := Memo1.Lines; {这里会出问题}   List.Free;
end;

//在 Delphi 7 及以前的版本中, 我们是通过查看一个类是不是有抽象方法来判断是不是抽象类的.

{现在可以用 class abstract 声明抽象类, 譬如:}
TBass = class abstract(TObject)
  procedure Proc;
  function Fun: string; virtual; abstract;
end; {但这好像仅仅是个提示, 如果其中没有抽象方法, class abstract 的定义只是个摆设, 譬如:}
TBass = class abstract(TObject)
  procedure Proc;
  function Fun: string;
end; {和} TBass = class(TObject)
  procedure Proc;
  function Fun: string;
end; {使用起来没看出区别!}

理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类的更多相关文章

  1. Spring的Aspect切面类不能拦截Controller中的方法

    根本原因在于<aop:aspectj-autoproxy />这句话是在spring的配置文件内,还是在springmvc的配置文件内.如果是在spring的配置文件内,则@Control ...

  2. unity3D 中的C#脚本一个类调用另一类中简单方法

    案例展示 SubMenuManage类中的实例化代码如下: static SubMenuManage sub_this; public static SubMenuManage Instance() ...

  3. Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇

    一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传 ...

  4. 再次深入理解delphi的类

    property WindowState: TWindowState read FWindowState write SetWindowState; {声明一个属性WindowState,它从字段FW ...

  5. 转 关于C#中派生类调用基类构造函数的理解

    关于C#中派生类调用基类构造函数的理解 .c#class       本文中的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1.  当基类中没有自己编写构造函数时,派生类默认的调用 ...

  6. 在头文件中声明class 类 与 include类所在的头文件区别---理解

    在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...

  7. 关于C#中派生类调用基类构造函数的理解

    (1)当基类中没有自己编写的构造函数时,派生类默认条用基类的构造函数 (2)当基类中有自己编写的构造函数时,要在基类中添加无参的构造函数 public class MyBaseClass { publ ...

  8. Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)

    前几天在CSDN社区看到一篇<如何得到自身单元名称>的帖子,其中一位名为sdzeng网友给出了答案.受此启发,自己写了一个函数,用来获取指定类的所有祖先类的名称及其所在的单元名称. //参 ...

  9. java笔记--理解java类加载器以及ClassLoader类

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...

随机推荐

  1. 分布式服务框架 Zookeeper — 管理分布式环境中的数据

    本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们理解. ...

  2. intellIJ IDEA配置maven相关问题记录

    IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository 参考:https://www.cnblogs.com/phpdragon/p/7216626.html non-m ...

  3. HTML5和CSS基础

    1 HTML 基本语法 html标签 单标签 <img /> .<img> 双标签 <html> </html> 属性 属于标签 <img src ...

  4. async/await工作机制探究--NodeJS

    ES6中的async/await让Promise变得更加简便,通常await处理的链式Promise会包裹在函数中,返回结果仍然是一个Promise对象. 但是当await直接处理链式Promise时 ...

  5. vs2019编译redis

    版本信息 使用Redis源码版本,解压工程右键生成hiredis项目正常,编译Win32_Interop项目报下图错误(error C2039:system_error:不是std成员;error C ...

  6. 180804-Spring之动态注册bean

    Spring之动态注册bean 什么场景下,需要主动向Spring容器注册bean呢? 如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + Groovy任务,就可以丢到这个平台上面来运 ...

  7. 通过Jmeter对Dubbo接口进行接口及性能测试

    dubbo接口/性能测试 dubbo简介 zookeeper简介.安装及配置 dubbo服务端demo dubbo客户端调用 jmeter工程改造及接口调用 读取jmeter参数用于dubbo性能测试 ...

  8. js数组的比较

    如果两个数组元素个数都相等,但排序不同,那么它两个相等吗?结果肯定是否定的.但如果先调用sort()方法进行排序,结果就是true了. console.log(a.sort().toString()= ...

  9. 在eclipse中修改项目发布tomcat的路径名

    第一种.右键点击项目,选中Properties 第二种.双击tomcat 保存 第三种.修改项目目录下的  .setting目录下的

  10. SMR解析

    SMR描述 SMR(Shingled Magnetic Recording)叠瓦式磁记录盘是一种采用新型磁存储技术的高容量磁盘.SMR盘将盘片上的数据磁道部分重叠,就像屋顶上的瓦片一样,这种技术被称为 ...