【问题标题】:Two Classes In Two Units With The Same Class Name in DelphiDelphi中具有相同类名的两个单元中的两个类
【发布时间】:2010-12-02 22:51:25
【问题描述】:

我在Delphi有一个案例比如:

单元 A 包含类“一” 单元 B 包含类“一”

我在一个使用单元 A 的类中,并想使用 B 中类 One 的静态函数;我该怎么做?在 C# 中,我会写如下内容:

B.One.SomeProcedure

或者我什至会使用“使用”来“重命名”一个命名空间。我可以在德尔福做什么? (删除单元 A 的“用途”不是一种选择,也不是重命名两个类之一。)

编辑:我使用的是 Delphi 2007。

【问题讨论】:

  • 如果您只是发布了代码的精简版,那么我们可以立即告诉您解决方案
  • 确切的代码并不重要;缺少的部分是两个单位都需要在“使用”条款中。来自 C# 背景,这让我很困惑,直到我弄清楚了。 (C# 允许在不导入其他单元的情况下使用完全限定的命名空间。)

标签: delphi namespaces


【解决方案1】:

“使用的类”是什么意思?也许您的意思是“使用的单位”?如果是这样,您需要将 A 和 B 添加到 uses 子句中。然后,您可以通过编写A.One.SomeProcedureB.One.SomeProcedure 来区分这两个过程。如果您只写One.SomeProcedure,则将使用uses 子句中列出的last 单元中的过程。 [这里我假设One 是包含类过程 SomeProcedure 的类。如果SomeProcedureOne 类的一个普通过程,你当然需要——当然——创建这个类的一个对象并使用它。然后您可以执行myobj := A.One.Createmyobj := B.One.Create,其中分别为var myobj: A.Onevar myobj: B.One。]

(还请记住,每个单元包含 两个 uses 子句:一个在 interface 部分的开头,一个在 implementation 部分的开头。如果您使用来自单元 A 在第 N 行,包含单元 A 的 uses 子句需要位于 N 上方的一行。)

还要注意,在 Delphi 中,该类应称为 TOne,并带有 T 前缀。每个人都遵循这个约定,没有它看起来很奇怪。

【讨论】:

  • 在 Delphi 2007 中,它给我的编译错误是 A.SomeProcedure 和 B.SomeProcedure 是未声明的标识符。
  • 好吧,如果SomeProcedureOne的类过程,那么你需要写A.One.SomeProcedure或者B.One.SomeProcedure,或者One.SomeProcedure
  • 太棒了。感谢您提及使用多个单位的复杂性。
【解决方案2】:

TNewClassA = class(UnitA.One) 和 TNewClassB = class(UnitB.One) 怎么样?

【讨论】:

  • 谢谢你,一个人永远不应该处于两种类型同名的情况......
  • 同意这是一个不愉快的情况。重构它也超出了我的能力。 C# 通过让您完全限定命名空间来很好地处理这个问题。 Delphi 也是如此——但您仍然需要将两个单元都放在“使用”中。
【解决方案3】:

您可以使用以下方式:[UnitName].[Function]。例如 B.SomeProcedure

【讨论】:

  • 我尝试了 B.SomeProcedure 和 B.One.SomeProcedure;都给我编译错误
  • 与 C# 不同,该单元仍应在使用列表中,尽管您使用的是完全限定名称。
  • 告诉我们您遇到了哪些编译错误会有所帮助。 Davita 的建议绝对有效。
  • 这就是秘诀——你仍然需要将声明放在“uses”中。来自 C# 背景的非常不直观。干杯。
  • 好吧,我不会将 C# 与 delphi 进行比较,C# 要优越得多 :) 很高兴它有帮助 :)
【解决方案4】:

你可以做同样的事情。 UnitName.ClassName.Method,就像在 C# 中一样。

【讨论】:

  • 您需要在“uses”子句中同时包含两个单位。这很令人困惑,因为我习惯了 C#,你不需要导入两个命名空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2016-03-03
相关资源
最近更新 更多