Delphi(Win32)中的静态类

10

在Delphi (Win32)中,是否可以将整个类(而不仅仅是类的函数)声明为静态的?


将每个变量、对象和方法手动设置为静态的(类变量)。就这些。 - VibeeshanRC
8个回答

12

看起来用户正在搜索“类函数”:

type
TSomeClass = class
class procedure MyFunction(...);
这就像是静态方法,所以调用它:
TSomeClass.MyFunction(...);

6

我建议使用抽象类(不要与类中的抽象方法混淆)来防止它被实例化,而不是将构造函数降级为受保护状态:

TMyClass = class abstract
public
  class procedure DoStuff; static;
end;

那将强制实行单例模式并防止任何实例化。

6

我想你是指像.net中的静态类(而不是传统Delphi / Native中的“static”) - 答案是否定的。


2
也许这可以帮助你理解为什么:静态类通常用于封装,类似于 Delphi 中的单元。 - Lars D
2
我宁愿不要假设。你能不能请明确表明你所说的“静态”是什么意思? - Rob Kennedy

4

我不太确定你所说的“静态类”是什么意思。你可以声明一个只有类方法的类,这样就可以在不实例化该类的情况下调用这些方法。

TSomeClass.SomeMethod;

这是您想要的吗?


2
你可以创建一个仅包含静态方法的类。如果你必须维护某种状态,则状态变量应该作为var参数传递。没有什么“正确”的方式来访问静态变量,除非在类实现部分之外的全局变量中定义一组。例如:
UNIT TestUnit;

INTERFACE

Type
  TStaticClass = Class
  public
    procedure Foo(var Bar:String); static;
  end;

IMPLEMENTATION

var
  LastBar : String; // the last bar
  LastRes : string; // the last result

Procedure TStaticClass.Foo(var Bar:String);
begin
  if Bar <> LastBar then
    LastRes := SomeCPUExpensiveProcess(Bar);
  LastBar := Bar;
  Bar := LastRes;
end;

INITIALIZATION
  LastBar := '';
  LastRes := SomeCPUExpensiveProcess('');
END.

2

原生不支持。

根据您需要它的用途,如果是为了您的代码,某些情况下,您可以将其替换为单例模式对象。

如果您需要实现此功能的详细说明,我建议您参考这个指南,该指南涵盖了几乎所有版本的Delphi,但如果您使用的是Delphi 2010,则还可以使用新的类构造函数/析构函数来获得更好的结果。


1

你也可以创建一个名为uDG_Utils的新单元,定义一个类,为该类定义一个全局变量,并在初始化和终止部分管理类的构造函数和析构函数。 现在你所需要做的就是像这样调用它:mySuperDuperClass.SuperMethod...


0

编辑 我已经编辑了这篇文章以将其删除。答案承认是糟糕的,值得被踩。我不希望它继续存在于这里,以免进一步混淆或误导任何人。


2
你需要关闭提示信息,这说明代码质量很差。 - Ken White
他要求一个不支持的功能,因此没有完美的解决方案。至于提示,我通常会同意并且不赞成关闭提示。提示通常是正确的,并指出可能是严重和难以捉摸的错误。但是请仔细看这个案例。1- 该代码在Delphi 7中没有提示。那么,在Delphi 2010中是糟糕的代码,但在Delphi 7中不是吗?嗯,也许是这样。2- 警告是“声明但未使用”。如果您将私有更改为受保护,并在2010中封闭类,则.Create仍然隐藏,但提示消失了。这使它变得更好吗?... - Phil Gilmore
我倾向于认为不是这样的。但是让我明确一点; 我不认为你错了,只是这种情况可能是一个例外,并且我认为它是许多罪恶中较小的一个,例如在公共构造函数中抛出异常以防止实例化。无论如何,即使是这种情况,您的观点也是正确的,我不想阻止任何人考虑它。 - Phil Gilmore
4
一个新颖的想法。然而,我认为你从未测试过这个…… 它行不通。默认的constructor TObject.Create();无法“删除”!如果你实现了一个名字不同的构造函数,Create()仍然可以被调用。如果你实现了一个与默认构造函数同名但可见性较低的构造函数,则在当前构造函数超出作用域时将调用默认构造函数。 - Disillusioned

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接