//抽象方法类似与接口; 在没有接口的年代 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. CSS快速入门-后端布局

    一.后台框架概述 我们在网上随便搜索后台框架,你会发现大部分都查不多.正所谓:好看的皮囊千篇一律,有趣的灵魂万里挑一. 第一个是H-ui,H-ui.admin是用H-ui前端框架开发的轻量级网站后台模 ...

  2. Zabbix实战-简易教程--订阅类

    一.需求提出 最近数据中心有一个新的需求,有一批后台任务需要在每天固定时间点运行(凌晨8:00),现在希望能够把这个任务执行的结果定时上报给他. 说明:执行的任务为一个sql查询,查询出来的是每个任务 ...

  3. 【转载】钉钉开发c#帮助类 获取用户信息 DingHelper.cs

    using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using Sys ...

  4. Android Service(下)

    阅读本文需要先阅读Android Service(上) 一 为什么需要bindService() 绑定服务就是为了和服务进行通讯 可以调用服务里面的方法 二 bindService()调用服务里面方法 ...

  5. SpringCloud版本问题

    兴致勃勃地跟随文档创建并配置Eureka Server工程后,启动准备测试,发现报了java.lang.NoSuchMethodError: org.springframework.boot.buil ...

  6. python 思维导图-linux命令

    linux基础 linux关于文件/目录的终端命令 linux关于文件内容处理的终端命令

  7. Netty源码分析第5章(ByteBuf)---->第2节: ByteBuf的分类

    Netty源码分析第五章: ByteBuf 第二节: ByteBuf的分类 上一小节简单介绍了AbstractByteBuf这个抽象类, 这一小节对其子类的分类做一个简单的介绍 ByteBuf根据不同 ...

  8. 安装keystone时创建用户失败

    系统:centos7.3 版本:openstack ocata 1.问题描述 安装keystone在创建用户时报错: The request you have made requires authen ...

  9. Refs 和 DOM

    在常规的 React 数据流中,props 是父组件与子组件交互的唯一方式.要修改子元素,你需要用新的 props 去重新渲染子元素.然而,在少数情况下,你需要在常规数据流外强制修改子元素.被修改的子 ...

  10. django_models后台管理myarya

    arya重点代码 # urls.py from django.urls import path,re_path,include from arya.service import v1 urlpatte ...