理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类
//抽象方法类似与接口; 在没有接口的年代 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] - 抽象方法与抽象类的更多相关文章
- Spring的Aspect切面类不能拦截Controller中的方法
根本原因在于<aop:aspectj-autoproxy />这句话是在spring的配置文件内,还是在springmvc的配置文件内.如果是在spring的配置文件内,则@Control ...
- unity3D 中的C#脚本一个类调用另一类中简单方法
案例展示 SubMenuManage类中的实例化代码如下: static SubMenuManage sub_this; public static SubMenuManage Instance() ...
- Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇
一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传 ...
- 再次深入理解delphi的类
property WindowState: TWindowState read FWindowState write SetWindowState; {声明一个属性WindowState,它从字段FW ...
- 转 关于C#中派生类调用基类构造函数的理解
关于C#中派生类调用基类构造函数的理解 .c#class 本文中的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1. 当基类中没有自己编写构造函数时,派生类默认的调用 ...
- 在头文件中声明class 类 与 include类所在的头文件区别---理解
在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...
- 关于C#中派生类调用基类构造函数的理解
(1)当基类中没有自己编写的构造函数时,派生类默认条用基类的构造函数 (2)当基类中有自己编写的构造函数时,要在基类中添加无参的构造函数 public class MyBaseClass { publ ...
- Delphi中获取某类的祖先类及其所在单元名称(使用GetTypeData(PClass.ClassInfo)函数,并且该类是从TPersistent类的派生类才可以这么使用)
前几天在CSDN社区看到一篇<如何得到自身单元名称>的帖子,其中一位名为sdzeng网友给出了答案.受此启发,自己写了一个函数,用来获取指定类的所有祖先类的名称及其所在的单元名称. //参 ...
- java笔记--理解java类加载器以及ClassLoader类
类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...
随机推荐
- Magic Trackpad 2 on win10 x64
可以使用操作: 触击 触击拖拽 双击 支手滚动:上下,左右 右键配置:左下角,右下角点击实现 可以试用28天,收费 $9.5 官方地址:http://www.trackpadmagic.com/mag ...
- Linux下的消息队列
文章链接:https://blog.csdn.net/qq_38646470/article/details/80169406
- linux管道详解
原文链接:http://blog.csdn.net/qq_38646470/article/details/79564392 符号表示 | 和管道特别形象. 作用: 管道是Linux中很重要的 ...
- [PLC]ST语言六:DI/EI/FEND/WDT/FOR/NEXT
一:DI/EI/FEND/WDT/FOR/NEXT 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言:
- SpringBoot之MongoTemplate的查询可以怎么耍
学习一个新的数据库,一般怎么下手呢?基本的CURD没跑了,当可以熟练的增.删.改.查一个数据库时,可以说对这个数据库算是入门了,如果需要更进一步的话,就需要了解下数据库的特性,比如索引.事物.锁.分布 ...
- Java字符串连接操作的性能问题
首先,看一段实验程序: package com.test; class StringTest { public static void main(String[] args) { long start ...
- jquery 3.0 新版本
https://code.jquery.com/
- 铁轨(rails, ACM/ICPC CERC 1997,Uva 514)
铁轨(rails, ACM/ICPC CERC 1997,Uva 514) 题目描述 某城市有一个火车站,铁轨铺设如图所示.有n节车厢从A方向驶入车站,按进站顺序编号为1~n.你的任务是让它们按照某种 ...
- 使用vbox构建局域网络
update: 也可以启用DHCP自动分配IP地址.(看到过的某一篇博文写过要使用这个服务还得自己搭--就没有动手去实践一下直接手动分配了静态的IP.偶然尝试了一下发现动态IP分配和手动静态IP分配都 ...
- caffe 预训练 或者Fine-Tuning 操作
1.使用预训练模型,需要修改训练的prototxt,将layer name改为与要使用模型的layer name相同即可. Borrowing Weights from a Pretrained Ne ...