【问题标题】:Can't specify static methods as part of an Interface?不能将静态方法指定为接口的一部分?
【发布时间】:2010-08-25 05:00:41
【问题描述】:

我有一组对象,我想符合一个接口,比如 ISpecialObject。 但是,在我的实现的一部分中,我想将这些特殊对象的实例化触发器封装在每个 ISpecialObject 的实现中。

比如说,我有一个实现 ISpecialObject 的类类型列表,然后我想遍历每一个并调用像 CanCreate(some data) 这样的静态方法,它告诉我是否创建其中之一的实例这些。

但是,.net 似乎不允许我将此静态 CanCreate 指定为 ISpecialObject 接口的一部分。

任何人都可以提出解决此问题的方法,或者解决这些对象的实例化封装问题的更好方法吗?我可能只是在想这一切都错了。

谢谢。

编辑:我可能对其中的某些部分措辞不佳。我不想在接口中提供实现,而是指定会有一个,并且它是静态的。本质上,我希望通过允许更高级别的对象在运行时查询何时创建它们来自定义对象。

【问题讨论】:

    标签: c# .net oop


    【解决方案1】:

    据我了解,您的主要问题是实例化一组符合相同接口的对象。如果是这样,您可能需要查看Factory Design Pattern,这是封装此类逻辑的标准方法。

    【讨论】:

      【解决方案2】:

      .NET 不允许在接口上声明静态方法。它们并没有真正的意义,因为接口都是关于合同的,并且完全避免了实现。静态方法专门用于实现。此外,接口方法是虚拟函数调用,具体取决于实例的类型,而静态方法独立于实例甚至类(它们可以放在任何具体类型上)。

      如果您有很多ISpecialObject 的实现,您可以使用工厂模式。为此,您将定义一个名为ISpecialObjectFactory 的接口以及ISpecialObject

      class ISpecialObjectFactory
      {
          ISpecialObject CreateInstance(...);
          bool CanCreate(...);
      }
      

      每个实现ISpecialObject 的类都应该有一个对应的ISpecialObjectFactory(例如UserObject 也应该有一个UserObjectFactory)。这需要更多代码,但这是一种常见模式,我相信它可以解决您的问题。

      【讨论】:

      • 我讨厌这种工厂模式,我更喜欢属性。
      • 我不是工厂的忠实粉丝,但属性不会是静态确定的吗?如果CanCreate 取决于运行时因素怎么办?此外,还涉及反射,尽管您可以将其减少到一次性成本。我想了解更多您的意思。
      • @Chris Schmich:查看任何 .NET IoC 库。对于自定义行为,您始终可以调用(咳嗽)工厂。 :)
      • 你们应该看看扩展接口的扩展方法。它们是解决问题的一种更简单的方法,因为它们确实为实现该接口的任何人提供了一个实现。
      • @leppie:啊,我明白你的意思了,虽然不是所有的 IoC 库都使用属性来连接。
      【解决方案3】:

      我没有看到问题。在处理静态方法时,类型名只是一个前缀。如果静态方法存在于其他地方,那将没有什么区别。

      也就是说,看看扩展方法,它可能确实希望你真正想要它:)

      编辑:另一个选项可能是使用属性。

      【讨论】:

        【解决方案4】:

        我们刚刚在另一个线程上讨论了与此非常相似的事情。 扩展方法绝对是解决这个问题的一种方法。它们可以提供接口的实现,这些方法可以被视为静态方法或用作正在扩展的对象实例上的方法。

        这与您提出问题的方式并不完全相同,但本质上是重复的,因此请查看下面的链接。

        StackOverflow - subclass-needs-to-implement-interface-property-as-static

        【讨论】:

        • 不完全。扩展方法仍然需要对象的实例。问题是询问静态方法。
        【解决方案5】:

        也许您可以将抽象类用作超类来实现您的目的。所以静态方法放在抽象类中,所有派生类也有。但是,我同意上面的帖子可能使用工厂模式是一种更好的方法。

        【讨论】:

          猜你喜欢
          • 2012-06-05
          • 2011-04-26
          • 1970-01-01
          • 1970-01-01
          • 2022-01-01
          • 2012-01-17
          • 1970-01-01
          • 2012-05-27
          • 2011-12-04
          相关资源
          最近更新 更多