2010-08-25 45 views
4

我有一套对象,我想符合一个接口,说ISpecialObject。 然而,我想要在每个ISpecialObject的实现中封装这些特殊对象的实例化触发器。无法将静态方法指定为接口的一部分?

所以说例如我有作为实现ISpecialObject的类类型列表,然后我想要通过每一个,并调用一个像CanCreate(一些数据),它告诉我是否创建一个实例的静态方法这些。

但是,.net似乎没有让我指定这个静态CanCreate作为ISpecialObject接口的一部分。

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

谢谢。

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

回答

2

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

如果你有很多ISpecialObject的实现,你可以使用工厂模式。为了做到这一点,你需要定义定义一个名为ISpecialObjectFactory接口旁边ISpecialObject

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

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

+0

我讨厌这个工厂模式,我更喜欢属性。 – leppie 2010-08-25 05:15:12

+0

我不是工厂的狂热粉丝,但不会静态决定属性吗?如果'CanCreate'取决于运行时间因素怎么办?此外,还涉及到反思,尽管您可以将其削减为一次性成本。我希望看到更多你的意思。 – 2010-08-25 05:19:24

+0

@Chris Schmich:查看任何.NET IoC库。对于自定义行为,你总是可以称呼(咳嗽)工厂。 :) – leppie 2010-08-25 05:21:06

1

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

这就是说,看看扩展方法,这可能确实希望你真的希望它:)

编辑:另一种选择可能是使用属性。

3

从我的理解,你的主要问题是一组符合相同接口的对象的实例化。如果是这样,你可能想看看Factory Design Pattern这是封装这种逻辑的标准方式。

1

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

这不完全是你说过这个问题的方式的重复,但它在本质上是重复的,所以请查看下面的链接。

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

+0

不完全。扩展方法仍然需要该对象的一个​​实例。问题在于询问静态方法。 – 2010-08-25 05:49:22

0

也许你可以使用一个抽象类作为超类为你的目的。所以静态方法进入抽象类,所有派生类也都有。不过,我同意上面可能使用工厂模式的帖子在这里是一个更好的方法。