【问题标题】:Delphi, is possible have a property and function with the same name?Delphi,是否可能具有同名的属性和函数?
【发布时间】:2010-12-18 23:40:51
【问题描述】:

考虑这段代码

type
  TMyObject=class
  private
    FName: Integer;
    function Name: Integer;
  public
    property Name : Integer read FName;
    function Name(Param1 : integer) : Integer; overload;
  end;

是否可以在delphi中创建同名的属性和函数(或过程)?

是否存在任何允许创建这样的类的指令或编译器开关?

【问题讨论】:

  • 解析器如何区分它们?
  • 你不需要问这个问题,你可以自己想出答案。编译器如何区分无参数 Name 函数和 Name 属性?

标签: delphi


【解决方案1】:

不,不是。此外,没有允许这样做的指令或编译器开关。

【讨论】:

    【解决方案2】:

    答案就在您尝试此操作时收到的错误消息中...您确实尝试过吗?

    【讨论】:

    • 是的,我试过了,我知道消息错误,但我提出这个问题是因为可能存在一个指令或编译器开关,它允许创建这样的类。
    • 为了其他读者的利益,你能说出错误信息是什么吗?
    • 那是消息[DCC Error] ProjectTest.dpr(14): E2004 Identifier redeclared: 'Name'
    【解决方案3】:

    因为我看到了overload 关键字。我怀疑也许你需要默认的是参数

    如果你使用

    function Name(Param1: Integer = SOME_VALUE): Integer;
    

    它可以被称为:=Name:=Name(5)

    【讨论】:

    • 你写的是真的,但它并没有真正回答问题(具有同名的函数和属性)。如果它是只读的,它不会有太大的区别,但只要它是一个读写属性,它就会有。
    • Smasher:但它不是读写的,所以在这种情况下两者是等价的。 OP 问题的答案是“否”,并且已经给出。
    • 显然答案是否定的。但我试图猜测他在做什么以及他可能真正需要什么,这就是我建议上述代码的原因。
    【解决方案4】:

    我偶然发现可以有一个类,其属性与父类中的函数同名(反之亦然)。

    但是,我会避免这样做,因为它会让您感到困惑。特别是如果函数和属性有不同的含义!

    【讨论】:

      【解决方案5】:

      目前,编译器无法执行您想要的操作。
      理论上,编译器的未来版本可以:

      方法的签名(是否重载)由名称和参数类型组成。
      索引属性的签名也是如此。
      由于属性和方法的签名空间是部分链接的(因此会出现编译器错误消息),因此可以扩展该组合空间以包括属性重载。

      当然,由于向后兼容性,该扩展可能会适得其反。

      --杰罗恩

      【讨论】:

      • (顺便说一句:完全限定的参数类型。Afaik 类型的单位名称也在其中。)
      • @Marco:单元和类名构成了我的意思的签名空间的父路径。
      • 由于两个声明看起来相同,您可以编写如下内容:X := Name; 编译器需要先确定您想要的“名称”版本,然后才能查看隐藏的签名/损坏的名称。如果你应该帮助它,你不妨调用一个 Name_A 和另一个 Name_B,这在当前编译器中工作得很好。
      • @Cosmin:当然更容易重命名。我并不是说应该扩展编译器,只是说理论上可以。
      猜你喜欢
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 2013-06-22
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多