当我调用基类上的方法时,如何调用后代的实现?

2023-12-01

我的顶级课程是TBaseDB,它有一个后代TCommonDB (, and TCommonDB将有多个后代,例如TProdDB and TDevDB).

让我们创建一个函数each类定义,称为Test1。目前,它所做的只是ShowMessage('Some literal')只是为了告诉我正在执行什么代码。

直到运行时我才知道类类型。我想要有共同的代码,但有不同的行为。

我想要的是这样的:

var
  MyObj: TBaseDB;
begin        
  //pseudo-code...
  if RadioButton1.Checked then
    MyObj := TBaseDB.Create
  else
    MyObj := TCommonDB.create;
  MyObj.Test1;    
end;

我似乎无法让它发挥作用,我想它是在我的类定义中。应该怎样Test1被定义为:

  1. 我可以将我的变量声明为TBaseDB,
  2. 创建的类可以是TBaseDB or TCommonDB, and
  3. the proper Test过程将根据实例被调用TBaseDB or TCommonDB?

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TFruit = class
  public
    procedure ShowMessage; virtual; abstract;
  end;

  TApple = class(TFruit)
  public
    procedure ShowMessage; override;
  end;

  TOrange = class(TFruit)
  public
    procedure ShowMessage; override;
  end;


{ TApple }

procedure TApple.ShowMessage;
begin
  Writeln('I''m an apple!');
end;

{ TOrange }

procedure TOrange.ShowMessage;
begin
  Writeln('I''m an orange!');
end;

var
  fruit: TFruit;

begin

  fruit := TApple.Create;

  fruit.ShowMessage;

  Writeln('Press Enter to continue.');
  Readln;

end.

关键词abstract允许您在基类中根本没有实现。不过,您也可以在那里实现:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TFruit = class
  public
    procedure ShowMessage; virtual;
  end;

  TApple = class(TFruit)
  public
    procedure ShowMessage; override;
  end;

  TOrange = class(TFruit)
  public
    procedure ShowMessage; override;
  end;


{ TFruit }

procedure TFruit.ShowMessage;
begin
  Writeln('I''m a fruit.');
end;

{ TApple }

procedure TApple.ShowMessage;
begin
  inherited;
  Writeln('I''m an apple!');
end;

{ TOrange }

procedure TOrange.ShowMessage;
begin
  inherited;
  Writeln('I''m an orange!');
end;

var
  fruit: TFruit;

begin

  fruit := TApple.Create;

  fruit.ShowMessage;

  Writeln('Press Enter to continue.');
  Readln;

end.

练习:

  1. 在每种情况下,如果您创建一个实例,会发生什么TFruit?
  2. 在第二种情况下,什么是inherited in TApple.ShowMessage and TOrange.ShowMessage意思是?他们需要处于程序的顶端吗?如果忽略它们会发生什么?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我调用基类上的方法时,如何调用后代的实现? 的相关文章

随机推荐

  • Linux 内核中哪里可以找到 TCP 数据(HTTP 下)?

    我正在尝试使用Linux内核中的TCP从HTTP流中读取数据 我能够从中获取大部分数据skb buff here 但是 如果服务器在没有请求的情况下将数据推送到客户端 则数据不会复制到用户空间 这样我就找不到它了 使用 Wireshark
  • 自定义订单排序

    您好 我想根据值 关键 高 中 低 对整个 C 列进行排序 我正在启用宏的工作表上运行此代码 这是我的代码 Sub run Range C C Sort Key1 Range C1 SortOn xlSortOnValues Order x
  • 如何在SSIS控制流任务中创建临时表,然后在数据流任务中使用它?

    我有一个控制流 我在其中使用 T SQL 命令创建临时数据库和表 当我添加数据流时 我想查询该表 但我不能 因为该表不存在可从中获取信息 当我尝试时 我收到有关登录的错误 因为数据库尚不存在 我有延迟验证为真 如果我手动创建数据库和表 然后
  • 使用mysqli_stmt_bind_result时在哪一行检查取数据是否成功?

    我需要向网站访问者表明 如果他对我的数据库进行查询在技术上失败 就会出现问题 想要让 php 代码回显 抱歉 出了问题 如果由于某种原因数据获取失败 以下是我试图实现这一目标的一些方法 3 个样品 它们会导致无休止的循环 从而使我的浏览器崩
  • 使用 Windows.Web.Http.HttpClient 类修补异步请求

    我需要做一个PATCH请求与Windows Web Http HttpClient类 并且没有关于如何执行此操作的官方文档 我怎样才能做到这一点 我找到了如何进行 定制 PATCH与上一个请求System Net Http HttpClie
  • 如何在更改属性后在设计时刷新 winform 自定义控件

    假设我创建了一个嵌入轨迹栏的自定义控件 我还为自定义控件创建了方向属性 当我将自定义控件放在窗体上时 默认情况下它将是水平的 然后我将其设置为垂直 轨迹栏应在设计时刷新为垂直 怎么办呢 我想你应该打电话Refresh 更改值后 public
  • Django cors 标头和服务器错误

    我正在尝试使用 django cors headers 将 COR 添加到我的服务器 但是当我加载页面时 我在服务器上收到此错误 ImproperlyConfigured Error importing module corsheaders
  • jqGrid 没有数据 - 如何设置更突出的“无数据”消息?

    默认情况下 当没有数据时 jqGrid显示消息 No records to view 在寻呼机内 我的网格使用顶部寻呼机 问题是 该消息很容易被错过 我想让网格在顶部标题下方显示消息 如果有任何数据 则在行显示的同一位置 在里面体层 如定义
  • 如何在heroku上为django应用程序安装ffmpeg?

    我想使用 ffmpeg 从视频中提取帧以将其用作海报 这是我第一次部署应用程序 更不用说在heroku上 所以我不知道如何在服务器上安装ffmpeg 我发现了这个 ffmpeg 版本并附有将其 供应商 到我的应用程序中的说明 然后调整我的应
  • Node.js 从网络获取图像并使用 Base64 进行编码

    我正在尝试从网络获取图像并使用 base64 对其进行编码 到目前为止我所拥有的是这样的 var request require request var BufferList require bufferlist BufferList bl
  • java arraylist 对所有元素求和

    如果我有 ArrayList
  • 属性“Id”是对象关键信息的一部分,无法修改

    我正在使用 Entity Framework 4 0 并且有一个我无法弄清楚的愚蠢问题 我有两张桌子 Contact Id 主键 Value ContactTypeId ContactType 的外键 联系人类型 ID 主键 类型 家庭 手
  • 如何使用 apps-script 覆盖内容超过 10MB 的文件?

    我有一个驱动器文件夹 其中有一些 g sheet 文件 每个文件都大于 100MB 我想用最新文件的内容覆盖最旧文件的内容 然后删除除最旧的文件之外的所有文件 我有两个问题 文件 代码 中出现异常 我的内容可能大于 10MB 难道是死路一条
  • Yii2 框架 facebook 和 google 使用 authclient 登录不起作用

    我已按照此处的说明进行操作http www yiiframework com doc 2 0 yii authclient authaction html 它对我不起作用 我正在使用 yii2 authclient 进行社交网站 faceb
  • 在电子表格的应用程序脚本中选择连续范围

    是否可以获取特定单元格周围的范围 类似于电子表格中的 Ctrl A 我有许多电子表格 其中的表格是由QUERY 功能 因此边界是灵活的 过去 我采用设置命名范围的方法 这些命名范围的大小是我预期的 QUERY 结果所需的最大大小 并将这些命
  • 如何在VS2008中针对3.5的项目中引用framework 4.0 dll

    我有一个使用 4 0 框架在 VS2010 中创建的 dll 是的 它是完整的 4 0 而不是客户端配置文件 我想在 VS2008 项目中引用它 这意味着即使我愿意 我也无法将引用项目重新定位到 4 0 并且无法将该项目升级到 VS2010
  • 编译,对于android 6.0,adb为“device-on-target”

    由于某种原因 在 android 6 0 上 device on target 的 adb 构建已从 Android mk 中删除 实际上 这非常有用 您可以看到 6 0 mk 和 5 0 mk 之间的差异 6 0 米克 https git
  • 用 lme4 数据绘制两个连续变量的交互作用

    我正在尝试绘制 R 中两个连续变量之间的交互作用 但是 我的数据是多级的 人们在几天内嵌套 因此在绘制图表时我需要考虑数据的嵌套结构 我使用 lme4 库分析数据以解释嵌套结构 但我很难弄清楚如何绘制它的图表 example data sp
  • 创建手动线程 - 但获得重复线程

    问题 获取重复的项目 即创建的线程数量多于数组大小 大家好 我正在为数组的每个元素循环创建线程 真正的用途是使用亚马逊ses发送一批消息 消息存储在 messageamazonRequestBatch 中 循环运行该批处理并发送消息 这是代
  • 当我调用基类上的方法时,如何调用后代的实现?

    我的顶级课程是TBaseDB 它有一个后代TCommonDB and TCommonDB将有多个后代 例如TProdDB and TDevDB 让我们创建一个函数each类定义 称为Test1 目前 它所做的只是ShowMessage So