【发布时间】:2016-09-22 18:20:56
【问题描述】:
我有一个 BaseImageView(平台在这里无关),它有一个属性Effect,它是一个command 对象。
我希望我的所有命令都实现IImageEffect,它有一个static 方法ApplyEffect,拍摄图像并返回带有效果的图像。
但编译器抱怨我无法将接口方法标记为static,但这似乎是合乎逻辑的选择(因为效果不需要状态信息)。
我问这个是因为我需要 100 个效果对象才能将 1 个效果应用到 100 个不同的图像,而我可以通过传递类和调用静态方法来逃避,这将取消 100 个实例。
有没有一种方法可以让我拥有一个静态接口,或者我可以传递一个类并让它调用该类型的静态ApplyEffect?
【问题讨论】:
-
不,接口成员不能是静态的。如果你调用
IImageEffect.ApplyEffect,CLR 怎么知道你想调用哪个实现? (对于带有泛型类型参数的静态接口成员有一个参数,但这更微妙。) -
@JonSkeet 我会将一个类传递给
Effect属性,然后在该类上调用ApplyEffect,所以它会变成EffectClass.ApplyEffect。然后它会知道我想在哪个特定的类上调用它。 -
抱歉,如果没有问题中的具体示例,这很难理解。如果您只想要一个始终执行相同操作的静态方法,只需将其放在类中而不是接口中...
-
你有什么理由不使用抽象类吗?
-
@MortenToudahl 我不想在每次使用该效果时都实例化同一类的新实例,所以我想将其设为静态,但我刚刚意识到这就是为什么发明了单例模式。我会继续使用它。
标签: c# polymorphism