我有一组对象,我想要符合一个接口,比如ISpecialObject。 但是,我的实现的一部分我想在每个ISpecialObject的实现中封装这些specialobjects的实例化触发器。
所以说例如我有实现ISpecialObject的类类型列表,然后我想通过每个类并调用一个像CanCreate(某些数据)这样的静态方法,它告诉我是否要创建一个实例这些
但是,.net似乎不允许我将此静态CanCreate指定为ISpecialObject接口的一部分。
任何人都可以建议一种方法来解决这个问题,或者更好的方法来解决这些对象实例化的封装问题吗?我可能只是想到这一切都错了。
感谢。
编辑:我可能已经把这部分内容表达得很糟糕了。我不想在接口中提供实现,而是指定将有一个,并且它将是静态的。基本上我希望通过允许更高级别的对象查询何时在运行时创建它们来自定义对象。答案 0 :(得分:3)
据我所知,您的主要问题是实例化一组符合相同界面的对象。如果是这样,您可能需要查看Factory Design Pattern,这是封装此类逻辑的标准方法。
答案 1 :(得分:2)
.NET不允许在接口上使用静态方法声明。它们并没有真正意义,因为接口都是关于合同的,完全避免实现。静态方法具体涉及实现。另外,接口方法是虚函数调用,具体取决于实例的类型,而静态方法独立于实例甚至类(它们可以放在任何具体类型上)。
如果您有许多ISpecialObject
的实现,则可以使用工厂模式。为此,您需要在ISpecialObjectFactory
旁边定义一个名为ISpecialObject
的接口:
class ISpecialObjectFactory
{
ISpecialObject CreateInstance(...);
bool CanCreate(...);
}
实现ISpecialObject
的每个类都应该有相应的ISpecialObjectFactory
(例如UserObject
也会有UserObjectFactory
)。这需要更多的代码,但这是一种常见的模式,我相信它可以解决您的问题。
答案 2 :(得分:1)
我没有看到这个问题。在处理静态方法时,typename只是一个前缀。如果静态方法存在于其他地方,它将没有任何区别。
那就是说,看看扩展方法,这可能会让你真的想要它:)
编辑:另一个选项可能是使用属性。
答案 3 :(得分:1)
我们刚刚在另一个主题上讨论过与此类似的内容。 扩展方法绝对是解决此问题的一种方法。它们可以为接口提供实现,并且可以将这些方法视为静态或用作正在扩展的对象实例的方法。
这与您提出问题的方式并不完全重复,但它本质上是重复的,请查看下面的链接。
StackOverflow - subclass-needs-to-implement-interface-property-as-static
答案 4 :(得分:0)
也许您可以将抽象类用作超级类用于您的目的。所以静态方法放在抽象类中,所有派生类也都有。但是,我同意上面可能使用工厂模式的帖子是一种更好的方法。