16

Delphi 2006为记录引入了新功能,使它们更加“面向对象”。

在哪些情况下,记录类型比类类型更适合设计?使用这些记录类型有什么优势?

4

4 回答 4

16

你有记录、对象和类。

记录从 turbo pascal 1 开始可用。它们是轻量级的,能够具有属性和方法,但它们不支持继承,返回记录的函数存在一些问题。如果这些记录有方法,这有时会产生内部错误:

type
  TRec = record 
    function Method1: Integer;
  end;

function Func: TRec;


procedure Test;
var
  x : TRec;

begin
  Func.Method1; // Sometimes crashes the compiler
  // Circumvention:
  x := Func;
  x.Method1; // Works
end;

如果我是正确的,对象是用 turbo pascal 5 引入的。然后他们为 OO 提供了一种使用 pascal 的方法。随着 Delphi 的引入,它们或多或少地被弃用了,但您仍然可以使用它们。对象可以实现接口。

Delphi 1 和最通用的类​​引入了类。它们实现接口并支持继承。但是每个类变量都是一个隐藏指针。这意味着需要在堆上创建类。幸运的是,这个过程大部分是隐藏的。

下表列出了三者之间的差异。我添加了完成的界面。

                  |Class|Object|Record|Interface|
------------------|-----------------------------|
Are pointers?     |  y  |  n   |  n   |    y    |
Inheritance       |  y  |  y   |  n   |    y    |
Helpers           |  y  |  n   |  y   |    n    |
Impl. Interface   |  y  |  y   |  n   |    -    |
Visibility        |  y  |  y   |  n   |    n    |
Method            |  y  |  y   |  y   |    y    |
Fields            |  y  |  y   |  y   |    n    | 
Properties        |  y  |  y   |  y   |    y    |
Consts            |  y  |  y   |  y   |    n    |
Types             |  y  |  y   |  y   |    n    |
Variants          |  n  |  n   |  y   |    n    |
Virtual           |  y  |  n   |  y   |    -    |
------------------|-----------------------------|
于 2009-05-09T17:45:13.903 回答
9

我认为这些功能在 Delphi 8 和 2005 中也可用。

主要准则:如果您有疑问,请使用课程。

对于其余部分,您必须了解主要区别:类对象始终通过引用使用,并通过调用构造函数创建。

Records 的内存管理和分配与基本类型(即整数、双精度)相同。这意味着它们按值传递给方法(除非使用 var)。此外,您不需要 Free 记录,这就是它们支持运算符重载的原因。但是没有继承或虚拟方法等。新记录可以有一个构造函数,但它的使用是可选的。

使用记录的主要领域和标准:

  • 在处理来自 Win32 API 的结构时

  • 当类型没有身份时(因为分配意味着复制)

  • 当实例不是太大时(复制大记录变得昂贵)

  • 在构建值类型时,其行为应模仿数字类型。例如日期时间、复数、向量等。然后运算符重载是一个不错的功能,但不要将其作为决定因素。

在效率方面,不要过度这样做:

  • 对于您经常放入数组的较小类型。

最后,从早期版本的 Delphi 中,使用类或记录的规则并没有真正改变。

于 2009-05-09T14:55:31.373 回答
6

除了其他答案(运算符重载、轻量级值类型)之外,让您的枚举器记录而不是类是一个好主意。由于它们是在堆栈上分配的,因此无需构造和销毁它们,这也消除了编译器在类类型枚举器周围放置的隐藏 try..finally 块的需要。

有关更多信息,请参阅http://hallvards.blogspot.com/2007/10/more-fun-with-enumerators.html

于 2009-05-09T15:54:26.287 回答
1

您可以使用运算符重载(如隐式转换)。您也可以在 Delphi 2007+ 或 2006.NET 上对对象执行此操作,但仅限于 2006 win32 上的这些记录。

于 2009-05-09T14:51:39.457 回答