2016-09-21 1 views
0

У меня есть BaseImageView (платформа здесь неактуальна), которая имеет свойство Effect, которое является объектом command.Почему я не могу пометить этот метод как статический?

Я хотел бы, чтобы все мои команды реализовали IImageEffect, который имеет метод staticApplyEffect, взяв изображение и возвращая изображение с эффектом.

Но компилятор жалуется, что я не могу пометить интерфейсный метод как static, но это похоже на логическую опцию (поскольку информации о состоянии, необходимой для эффекта) нет.

Я спрашиваю об этом, потому что мне понадобится 100 объектов эффектов, чтобы применить 1 эффект к 100 различным изображениям, в то время как я мог уйти с передачей класса и вызовом статического метода, это устранит 100 экземпляров.

Есть ли способ, которым я могу иметь статический интерфейс или способ, которым я могу передать класс, и вызвать ли он статический ApplyEffect этого типа?

+0

Нет, элементы интерфейса не могут быть статическими. Как CLR узнает, какую реализацию вы хотели бы назвать, если вы назвали 'IImageEffect.ApplyEffect'? (Есть аргумент для статических членов интерфейса с аргументами общего типа, но это более тонкий.) –

+0

@JonSkeet Я передал бы класс в свойство 'Effect', а затем вызывается' ApplyEffect' в этом классе, поэтому он станет 'EffectClass .ApplyEffect'. Тогда он будет знать, какой конкретный класс я хочу назвать. – vrwim

+2

Извините, это очень трудно понять без конкретного примера * в вопросе *. Если вы просто хотите, чтобы статический метод всегда делал то же самое, просто поместите его в класс вместо интерфейса ... –

ответ

0

Я предлагаю вам либо сделать абстрактный класс, где вы реализуете статический метод, как вы хотели бы сделать с интерфейсом.

Это может выглядеть следующим образом

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 
{ 

} 

Или создать статический класс, чтобы применить эффект с, если вы не хотите, чтобы inherrit от абстрактного класса.

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

 Смежные вопросы

  • Нет связанных вопросов^_^