如何将不同的类封装在一个类中并保持其独特的方法? (delphi中的多重继承?)

2024-01-06

我目前正在重写一个免费的教育数字电路模拟器,以为其功能添加惯性。我的问题是如何将事件分派到原始类,并向它们添加预先阐述。我有这样的事情:

TC1 = class
  ID: integer;
  Connections : array [integer] of Pin;
  function Func1; virtual;
  function FuncN;
end;

TC2-1 = class (TC1)
  function Func1; override;
  function My1Func();
end;

TC2-n = class (TC1)
  function Func1; override;
  function MyNFunc();
end;


TContainer = class
  C1 : TC1;
  function ContFunc;
end;

function Container.ContFunc;
begin
    c1.Func1;
end;

现在这意味着 ContFunc 如我所愿调用 C2.Func1,专门继承 TC1 的 300 多个组件的行为。

但现在我必须添加一些特殊操作(对于所有组件后代都相同 每次调用 Func1 时从 TC1 开始,并在该操作期间进行选择(如果必须的话) 是否调用 TC2-n.Func1(在更改祖先 TC1 的某些属性后)。 有没有一种方法可以干净地做到这一点,而不改变 TC1 的所有后代? 我可以像这样使用辅助类(已弃用吗?):

TH = class helper of TC1
  function Func1 virtual; override;
end;

function TH.Func1;
begin
  if x then TC2.Func1 else SaveActionData; 
end

如果我加上TH,当TContainer调用Func1时,调用谁? 它调用 TC2.Func1 而不是我希望的 TH.Func1? 有没有办法重写后代方法 Func1 无需为任何单个类编写辅助类(它们将完成所有操作) 相同的操作,意味着完全相同的代码)? 可以从 TH 调用 TC2-n 的 300 个后代函数 Func1 吗?

换句话说,我试图找到一种方法来通过 Tcontainer 调用 c1.Func1; 来获得这样的调用:

调用 TC2.Func1(对于 TC1 的任何后代都不同)的 NewFunc1(对于所有 TC1 后代都相同)。

任何人都可以建议一种方法来做到这一点?


每当有人打电话时,您都需要执行一些任务Func1,无论后代选择在他们的重写方法中做什么。这是一份工作模板法图案。

给基类一个公共非虚方法Func1它执行您需要的操作,然后调用受保护的虚拟方法。后代可以重写该虚拟方法,但使用该类的任何人只能调用公共非虚拟方法。

type
  TC1 = class
  protected
    function InternalFunc1: Integer; virtual; // abstract?
  public
    function Func1: Integer;
  end;

function TC1.Func1;
begin
  if x then
    Result := InternalFunc1
  else
    Result := SaveActionData; 
end;

现在后代可以覆盖InternalFunc1,并且基类将确保仅在适当的时候才调用它。

type
  TC2 = class(TC1)
  protected
    function InternalFunc1: Integer; override;
  end;

您需要重命名当前的Func1在您所有 300 个后代类别中发挥作用。 IDE 的重构工具也许能够帮助解决这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将不同的类封装在一个类中并保持其独特的方法? (delphi中的多重继承?) 的相关文章

  • Java抽象类实现了一个接口,两者具有相同的方法

    在看一些OOP资料时 我想到了这个让我有点困惑的问题 考虑具有以下接口 抽象类和具体类 package one public interface A void doStuff package one public abstract clas
  • VCL.位图到 FMX.位图

    我在网上找到了这段代码 但 FMX Bitmap 没有扫描线 是否可以以某种方式将 VCL TBitmap 复制或绘制到 FMX Bitmap IFDEF MSWINDOWS type TBitmap FMX Types TBitmap T
  • 如何在 OSX 上的应用程序名称下创建子项菜单?

    如何在下面添加TMenuItemProject1以上Quit在下面的屏幕截图上 我创建了一个 TMenuBar 并选中了 UseOSMenu 属性 我添加的第一个 TMenuItem 是主栏中的第二个 TMenuItem 您可以通过将 II
  • 如何在Delphi XE中通过名称获取类类型引用?

    我实际上正在尝试使用 Rtti 来实现通用方法调用程序 它应该像这样工作 我将提供类名 方法名和参数 调用者将通过调用此类的指定方法来完成其工作 因此 我需要类引用才能获取其 Rtti 信息并寻找我想要调用的方法 有没有办法在不实现我想要使
  • 在运行时按需更改组件类

    我的问题与这里的想法类似 替换delphi中的组件类 https stackoverflow com q 4685863 937125 但我需要改变一个specific按需组件类 这是一些伪演示代码 unit Unit1 TForm1 cl
  • 我如何在Delphi中处理事件?

    例如 我有一个程序 在单击 Button1 后执行某些操作 如果没有 Button1Click 中的代码 如何处理按钮的 onclick 事件 我需要为 Button1 动态添加事件 unit Unit1 interface uses Wi
  • 如何在Delphi中下载一个非常简单的HTTPS页面?

    我尝试了在这里看到的代码 但它不适用于 HTTPS 我需要将此页面作为字符串下载 并在其上添加一些换行符 以便将信息按顺序放入 TMemo 中 怎么做 我尝试使用 Indy 但由于 SSL 问题而失败 我尝试了此页面的解决方案 如何将网页下
  • 如何在调试器中显示 TStringList 的内容?

    我想在调试应用程序时显示 TStringList 的全部内容 相反 我只是得到指示 Flist 仅显示地址 如果您使用的是 Delphi 2010 或更高版本 调试器允许使用调试可视化工具 http docwiki embarcadero
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • 以编程方式重新启动 Delphi 应用程序

    应该不可能运行我的应用程序的多个实例 因此项目源码包含 CreateMutex nil False PChar ID if GetLastError ERROR ALREADY EXISTS then Halt 现在我想以编程方式重新启动我
  • 不断断点?如何去除它们?

    我下载了一个用Delphi 2009制作的项目 这也是我使用的 但是有一个断点我无法删除 如果我尝试删除它 它会在程序执行后再次执行 我在其他调试器中遇到了这样的事情 称为硬件断点 但这并不重要 如何删除断点 EDIT Article ht
  • 在 Delphi 中使用 XML(将特定数据返回到变量)

    过去几天我一直在尝试使用 Delphi 2010 和 MSXML 我是一个极端的新手 需要一点指导 var MemoryStream TMemoryStream XMLPath String sName String XMLDoc vari
  • 将数据从一个数据集结构移动到另一个数据集结构的更快方法(在 TDatasetProvider 中)

    我有一个自定义的 TDatasetProvider 它允许为其提供的任何数据创建新字段 因此 假设您在原始数据集上获得了以下字段 客户ID Name Age 您需要使用显示位图在 DBGrid 上选择它 好吧 你可以 因为我的 DSP 可以
  • TObjectList.Contains 导致 Delphi 2009 中的访问冲突

    在 Delphi 2009 中 到目前为止 我在泛型方面没有遇到大问题 使用 Generics Collections 列表 没有特殊的泛型功能 现在我发现这段代码会在访问的行中导致AVMyList Contains 如果我声明 TMyLi
  • 如何从 VCL.Graphics 获取所有已注册的文件格式...但 64 位

    在我的 32 位应用程序中 我使用FindRegisteredPictureFileFormats 单元由 Cosmin Prund 提供 https stackoverflow com a 14677532 505088 gt 如何从图形
  • Delphi IDE导致CPU过热

    我正在使用 Delphi 7 但我已经尝试过 Delphi 2005 2010 版本 在所有这些新版本中 当 Delphi IDE 在屏幕上可见时 我的 CPU 利用率为 50 一个核心为 100 另一个核心为 宽松 当 IDE 最小化时
  • 如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

    因此 经过最近的一些更改 我们发现我们最古老的应用程序之一有时会在关闭时崩溃 这会以 运行时错误 216 消息的形式或来自 Windows 错误报告的消息的形式表明应用程序已停止工作 该应用程序已经发出OutputDebugString 每
  • EOutOfMemory 使用 Delphi 创建大型 XML

    我正在使用 Delphi 从关系数据库中的数据创建 XML 文档 它在小数据集上测试得很好 但是当我尝试将数据集的大小扩展到生产级别时 它最终在节点创建期间因 EOutOfMemory 异常而崩溃 我正在使用放在表单上的 TXMLDocum
  • TListView 中的中心子项目图像

    Is it possible to fix the drawing of subitem images in a TListView so that they are not cut off on the left hand side as
  • 从创建 UI 的同一线程更新 VCL。为什么?

    我知道我必须调用 Synchronize 来从未创建控件或向窗口发送消息的线程更新 vcl 我经常听到 线程不安全 这个词 但我找不到关于正在发生的事情的实际解释 我知道应用程序可能会因访问冲突而崩溃 但我又不知道为什么 请阐明这个主题 V

随机推荐

  • 如何防止在 Razor(独立)中转义 html?

    我有一个模型 其属性 Content 包含 HTML 字符串 var model new Content Razor Parse templateBody model 如何使用独立 Razor 渲染此字符串 I tried new Html
  • 为什么在 try 块中重新声明函数标识符会引发语法错误?

    以下 JavaScript 行 try function free var free 1 finally 导致以下错误 Uncaught SyntaxError Identifier free has already been declar
  • R 中从右到左的语言支持(使用 Mac)

    我想知道在使用 Mac 时是否有支持 R 中从右到左语言的方法 例如假设以下代码 x lt data frame a runif 10 b runif 10 ggplot x aes a b geom point xlab 结果如下 在这里
  • 绑定到静态类实例中的属性

    我想要实现的目标 我有一个 WPF 应用程序 仅用于测试 我想将标签的文本 内容 绑定到某处的属性 这个想法是 当用户选择不同的语言时 该属性值将会改变 当属性更改时 我希望标签文本更新为新值 我尝试过的 我尝试创建一个具有标签值静态属性的
  • 检查 Internet Explorer 中的伪元素

    我有以下伪元素 input type radio selected before 在互联网浏览器中 伪元素根本不显示 所以我决定看一下 我在检查器中找到了选择器 检查器中的选择器将是一本很棒的儿童读物 但是所有属性都被删除了 即覆盖 无效
  • webpack 构建中意外的令牌“导出”

    我收到的错误是 webpack 无法将导出识别为关键字 我已经更新了 babelrc 并安装了必要的依赖项 我确信这与不理解 es6 有关 但我找不到解决我的问题的解决方案 以下是查看我的依赖项 错误和重要文件所需的文件 index scs
  • Google Go 语言中哪些类型是可变的和不可变的?

    在 Google Go 中 我读到字符串是不可变的 好吧 但是是 int 吗 那么其他类型呢 作为一个稍老的程序员 我更喜欢可变性 尽管我知道不变性的好处 但我更喜欢危险地生活 了解哪些类型是可变的或不可变的将非常有帮助 更新 我最关心的是
  • tools/bazel.rc 如何与外部工作区依赖项一起使用?

    如果我将外部 Bazel 项目作为 WORKSPACE 依赖项拉入 并且该项目有一个 tools bazel rc 添加了一些默认构建选项并定义了一些构建 config 选项 那么它到底是如何工作的 构建这些外部构建目标时是否使用这些默认选
  • 如何显示 Cabal 项目的依赖关系树

    我在用cabal v2 build构建一个项目 但它在我不直接依赖的包上不断失败 有没有办法与cabal列出包的所有依赖项 最好以树格式 这样我就可以看到我所依赖的调用构建失败的内容并 希望 摆脱它 Try cabal plan https
  • 如何保存 HTML5 画布?

    目前我正在使用画布2图像 http www nihilogic dk labs canvas2image 保存 HTML5 画布的内容 然而 它似乎不适用于 Google Chrome 欢迎任何有关如何解决该问题的想法 canvas toD
  • 我可以使用委托的单个实例来启动多个异步请求吗?

    只是想知道是否有人可以澄清使用BeginInvoke当您想要进行多个异步调用时 在某个委托的实例上 因为 MSDN 文档根本没有真正涵盖 提及这一点 我想做的是类似以下的事情 MyDelegate d new MyDelegate this
  • 我的表需要更多标准化吗?

    我正在制作一个简单的公共现金簿数据库表来计算我和我的朋友一起吃饭花了多少钱 我的第一个表只是一个表 它有一个具有非原子值的 person 列 所以我将表分成两个表 如上所示 但我不确定这是否足够正常化 是否存在任何应该规范化的功能依赖性 但
  • Google 数据源 JSON 无效吗?

    我正在使用他们的Google数据源来实现Python库 http code google com apis visualization documentation dev gviz api lib html tojsonexample 我希
  • Android 2.3 的 ActionBarCompat 中没有 FEATURE_INDETERMINATE_PROGRESS -

    我在用着 requestWindowFeature Window FEATURE INDETERMINATE PROGRESS setSupportProgressBarIndeterminateVisibility true setSup
  • regsvr32 是否有 .NET 或 Win32 版本?

    regsvr32 是否有 NET 或 Win32 版本 我想用代码注册一个 COM DLL 而不是使用 regsvr32 程序 注册程序集的标准方法是调用导出的DllRegisterServer装配体上的功能 http msdn micro
  • 如何以编程方式重新加载 Visual Studio Code 窗口?

    用户可以通过编辑器的 命令面板 运行 重新加载窗口 来实现此目的 然而 从扩展创作的角度来看 这并不像立即提示用户那么简单 期望的结果是将当前的实施this https github com xabikos vscode javascrip
  • 从 NSOperationQueue 取消 NSOperation 导致崩溃

    我正在尝试构建一个下载管理器类 它将所有异步下载 每个操作都有自己的线程 操作打包到 NSOperation 子类中 以便稍后将它们添加到 NSOperationQueue 中 下载管理器类 单例 还公开了一些方法来处理队列并取消符合某些要
  • 在本地文件夹中安装 gem

    我在使用的共享计算机上的权限有限 因此无法按照习惯的方式安装 gem 例如 gem install request log analyzer ERROR While executing gem Gem FilePermissionError
  • 组合的自定义过滤器

    我正在使用 Webix 用户界面 它允许定义组合控件 如下所示 webix ui view combo options One Two Three 它工作得很好 除了一瞬间 默认情况下 组合按文本统计过滤数据 输入 o 后 组合列表将仅显示
  • 如何将不同的类封装在一个类中并保持其独特的方法? (delphi中的多重继承?)

    我目前正在重写一个免费的教育数字电路模拟器 以为其功能添加惯性 我的问题是如何将事件分派到原始类 并向它们添加预先阐述 我有这样的事情 TC1 class ID integer Connections array integer of Pi