Delphi 7:通过VFI的抽象类

时间:2013-04-10 14:35:51

标签: delphi inheritance delphi-7

在Delphi 7中是否可以创建一个可以通过Visual Form Inheritance技术继承的抽象类?如果是,请举例说明。

任务就是这个。我想创建一个表单,作为两个其他表单的基本表单,将继承该表单的所有属性。这两个继承表单将用于向数据库添加新东西(例如创建产品项)和编辑这些东西。所以,我想基本形式应该被认为是一个抽象类,应该没有问题,取消按钮和所有继承类将共享的东西。好吧,它显然是一个抽象类,因为除了作为基于其他形式的表单之外,没有其他形式的使用。

这是一个简单的图表,使这一点更加清晰:

enter image description here

3 个答案:

答案 0 :(得分:2)

首先,我们需要定义抽象类的含义。在我看来,有两个相互竞争的定义:

  1. 抽象类是无法实例化的类。这是最常用的定义。
  2. 抽象类是包含多个抽象方法的类。
  3. 由于Delphi没有强制执行定义1的语言机制,因此定义2似乎是适用于此问题的定义。

    问题的答案是包含抽象方法的类可以与Visual Form Inheritance一起使用。

    Delphi的现代版本允许您使用abstract关键字来装饰类。但是,这没有效果。您仍然可以实例化这样的类。我的理解是为了Delphi .net编译器的利益添加了abstract关键字。

    同样,在现代版本的Delphi中,您可以将编译器配置为使用抽象方法将类的实例化视为编译错误。这可能是德尔福最接近定义1的。

    但是,即使这样也不完全遵循定义1,因为这些类可以通过RTTI或虚拟构造函数实例化。设计组件实例化的机制就是一个很好的例子。

    以此课程为例:

    type
      TForm1 = class(TForm)
      public
        procedure Boo; virtual; abstract;
      end;
    

    即使您将包含抽象方法的 W2000构造实例的选项设置为错误,您仍然可以让框架实例化该类。只有当你编写TForm1.Create编译器对象时才会这样做。

答案 1 :(得分:2)

你使用术语 abstract ,但是阅读你的问题,我真的怀疑你是否真正意味着定义了Delphi中 abstract 的方式。我认为你的意思是用一般简单的方式表达 abstract :你想要设计一个包含必须被后代改变或添加的部分的表单。 Delphi中的抽象方法意味着没有实现的类例程。然而,这并不重要,因为完全有可能设计一个基本形式,有或没有抽象方法。

您可以如下图所示创建设置,如下所示:

  • 设计一个包含2个修改,2个标签,2个按钮和1个动作列表的表单TBaseForm
  • 向ActionList添加3个操作:创建,保存和取消,
  • 事先将Cancel操作分配给CancelButton.Action,
  • 保存表单,
  • 使用菜单命令设计一个继承自TBaseForm的新表单:File>新>其他> [项目名称]>基本形式
  • 您将拥有一个包含编辑,标签,按钮和操作的新表单
  • 将保存操作分配给其他按钮的操作属性
  • 给它一个“编辑项目”标题,
  • 保存表单,然后重复“创建新项目” - 表单。

如果您愿意,基本表单可能有抽象方法。在运行时创建TBaseForm实例时,编译器将发出警告构造包含抽象方法'TBaseForm.MethodName'的'TBaseForm'实例。它仍然是一个警告,直到您在运行时调用该方法将产生抽象错误。创建实现该方法的后代表单,然后就不会有警告。在设计器中使用抽象方法创建表单不会产生警告。然后可能仍会出现运行时错误。

答案 2 :(得分:2)

不,你不能创造一个"摘要" Delphi中的基本形式视觉形式继承在严格的Delphi意义上的单词" abstract"。

但是,根据您的描述,它听起来并不像您确实需要一个严格抽象的基本形式。你根本没有提到定义抽象方法的要求。

听起来您只需要一个基本表单,您可以从中创建多个不同的专用后代,这些后代可以与基本表单共享UI和实现。

这就是VFI的用途,所以是的,你可以做到。