【问题标题】:Why can't I mark this method as static?为什么我不能将此方法标记为静态?
【发布时间】: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


【解决方案1】:

我建议您在实现静态方法的地方创建一个抽象类,就像您想对接口做的那样。

可能是这样的

class Program
{

    static void Main(string[] args)
    {
        BaseImageView.ApplyEffect();
        // Or
        EffectClass.ApplyEffect();
    }

}

public abstract class EffectClass
{
    public static void ApplyEffect()
    {
        // Effect of awesomeness
    }
}

public class BaseImageView : EffectClass
{

}

如果您不想继承抽象类,也可以创建一个静态类来应用效果。

public static class EffectClass
{
    public static void ApplyEffect()
    {
        // Effect of awesomeness
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2011-03-02
    • 2014-01-03
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多