【问题标题】:C# Equivalent of Delphi's "class" function / procedureC# 等效于 Delphi 的“类”函数/过程
【发布时间】:2019-03-29 16:27:51
【问题描述】:

我已经进行了一些搜索,但似乎无法找到与此问题完全匹配的内容。如果我错过了,请重定向我。

在 Delphi / Object Pascal 中有两个概念:

  1. 类方法 - 允许您在不需要类实例的情况下调用方法。然而,这些方法仍然允许在派生类中进行覆盖(因此在某种程度上仍然携带一些类信息)。
  2. 静态方法 - 将方法标记为静态 - 因此不再允许虚拟/覆盖关键字 - 没有类信息/没有继承“知识”

*您可以在上面纠正我。

问题:C#中Delphi的类方法(非静态)等价物是什么?我希望能够声明一个可以在没有类实例的情况下调用的方法 - 但是我希望能够将基方法标记为虚拟并在派生类中覆盖它.

【问题讨论】:

标签: c# class delphi inheritance comparison


【解决方案1】:

类方法 - 允许您调用方法而不需要 类实例。然而这些方法仍然允许在 派生类(因此在某种程度上仍然带有一些类 信息)。

你确定吗?

无论如何,我们拥有的最接近的东西是具有静态方法的类。

public class MyLovelyHorse
{
    public static int HowManyLegs()
    {
        return 4;
    }
}

但我希望能够将基本方法标记为虚拟并且 在派生类中覆盖它

对不起,没办法。 C# 中没有工具可以做到这一点。

这大概是你应该参观Classes and Structs (C# Programming Guide)的时候了

【讨论】:

  • 感谢您的快速回复。我比较肯定,除非我的眼睛在捉弄我。测试:我在基类中有一个实例方法这个实例方法调用了基类中的类方法(未标记为静态)。在调试模式下单步执行表明派生类的类方法被调用。正是我想要的,但没想到会发生这种情况。是的,将再次浏览 .net 文档。
  • 我认为您可能需要在此处使用关键字更严格一些。实例方法是需要在调用它之前创建其类的对象的方法。静态方法是C#中无需创建类对象即可调用的方法
  • @TheGeneral 在 Delphi 中,class 方法仍然有一个 Self 参数,但它指向类类型而不是对象指针。是的,class 方法可以是 virtual 并被覆盖。另一方面,static 方法没有 Self 参数,这就是为什么它们不能是 virtual
  • @Danie:不,它仍然表现为类方法,即使您从实例中调用它也是如此。在类的实例方法中,您不必用类名来限定它,这是隐含的。
  • @TheGeneral:在 Delphi 中,甚至 构造函数 也可以是虚拟的。这是您只能在 Object Pascal 派生语言中看到的内容。如果您从元类调用构造函数,则构造函数的虚拟性很有用。元类包含类的类型,调用虚拟构造函数意味着您调用元类中包含的实际类的构造函数。在 C# 中,这只能模拟使用 GetType() 和反射,AFAIK。
【解决方案2】:

不能在 C# 中做到这一点 - 想法是静态方法总是针对特定类型调用,永远不会有实例。这是不正确的,因为您可以将派生类的类型信息传递给采用基本类类型的函数...

如果函数不应该做任何花哨的事情(例如,它只返回一个静态值),您可以使用类属性而不是虚拟静态方法。

【讨论】:

  • 感谢您的快速响应。是的,我认为这对于 C# 来说是一个很好的解决方法。传递类型信息。只是想知道这是否被隐式支持。
  • 我不这么认为 - Delphi 中没有与“class of”等效的 C#。您可以使用具有“where”类型限制的泛型,但泛型是在编译时评估的,它们不是动态的。
【解决方案3】:

Delphi 和 C# 有一些相似之处。它们都不支持多重继承。

关于你的问题,对于你打算隐藏基类的方法实现的方法,你可以使用 new 关键字。

Delphi 中的静态与 C# 的工作方式相同。您不能覆盖静态方法。如果您希望执行相同的操作,C# 还带有一个 static 和 seal(用于类)关键字。

【讨论】:

  • 这实际上是关于虚拟类方法,而 C# 根本没有。在Delphi中,有普通的类方法,也有Self/this参数,但是对于类方法,Self是类,不是实例。这些类方法可以是虚拟的。但是您也可以将它们标记为静态,这与 C# 中的相同。使用new 隐藏是德尔福使用reintroduce 所做的。
  • 不要忘记,C# 的主要架构师 Anders Hejlsberg 在他的 Borland 时代也是 Delphi 的主要架构师。
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多