2016-09-21 3 views
0

Ich habe eine BaseImageView (Plattform ist hier irrelevant), die eine Eigenschaft Effect hat, die ein command Objekt ist.Warum kann ich diese Methode nicht als statisch markieren?

Ich möchte alle meine Befehle zu implementieren IImageEffect, die eine static Methode ApplyEffect hat, ein Bild zu nehmen und das Bild mit dem Effekt zurückgibt.

Aber der Compiler beschwert sich, dass ich eine Interface-Methode nicht als static markieren kann, aber das scheint die logische Option zu sein (da für den Effekt keine Statusinformationen benötigt werden).

Ich frage dies, weil ich 100 Effektobjekte benötigen würde, um einen Effekt auf 100 verschiedene Bilder anzuwenden, während ich mit der Klasse fortfahren und die statische Methode aufrufen könnte, würde dies die 100 Instanzen beseitigen.

Gibt es eine Möglichkeit, ich kann eine statische Schnittstelle haben, oder eine Möglichkeit, die ich eine Klasse übergeben kann und es die statische ApplyEffect dieses Typs aufrufen?

+0

Nein, Schnittstellenelemente können nicht statisch sein. Wie würde die CLR wissen, welche Implementierung Sie aufrufen wollten, wenn Sie 'IImageEffect.ApplyEffect' aufgerufen haben? (Es gibt ein Argument für statische Interface-Member mit generischen Typargumenten, aber das ist subtiler.) –

+0

@JonSkeet Ich würde eine Klasse an die 'Effect'-Eigenschaft übergeben und dann' ApplyEffect' für diese Klasse aufrufen, so dass sie zu 'EffectClass' würde .ApplyEffect'. Dann würde es wissen, in welcher spezifischen Klasse ich es nennen möchte. – vrwim

+2

Sorry, das ist ohne ein konkretes Beispiel * in der Frage * sehr schwer zu verstehen. Wenn Sie nur eine statische Methode verwenden möchten, die immer dasselbe tut, fügen Sie sie einfach in eine Klasse anstelle einer Schnittstelle ein. –

Antwort

0

Ich würde vorschlagen, dass Sie entweder eine abstrakte Klasse erstellen, wo Sie die statische Methode implementieren, wie Sie mit der Schnittstelle tun wollten.

es so

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 
{ 

} 

aussehen könnte oder eine statische Klasse erstellen, die Wirkung mit anwenden, wenn Sie von einer abstrakten Klasse nicht inherrit wollen.

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