2017-08-24 1 views
0

zu erklären, Ich versuche, eine interface wie diese zu erstellen:Wie ein Verfahren in einer Schnittstelle mit unbekannten Anzahl und Typ Argumente

public interface IProcessable<out T> 
{ 
    T Result { get; } 

    T Execute(params object[] args); 
} 

ich eine Execute() Methode haben wollen, die T zurückgibt und kann jede Art von Argumenten akzeptieren.
Und ich will es so verwenden:

public class CustomProcess: IProcessable<int> 
{ 
    public int Result { get; private set; } 

    public int Execute(string customArg) 
    { 
     /// some codes to return int 
    } 
} 

IProcessable<int> wird mich zwingen, eine Execute Methode wie folgt hinzuzufügen:

public int Execute(params object[] args) 
{ 
    var customArg= args[0] as string; 
    if (customArg!= null) //I know that this is not so necessary for `string` 
    { 
     return Execute(customArg); 
    } 

    throw new Exception(); 
} 

Ich denke, ich beide Methoden in CustomProcess wegen breit haben sollte akzeptabler Bereich von object[].

weiß, dass ich fragen sollte:
Ist diese Art der Schnittstelle ist akzeptabel, oder ist eine Art eines anti-Muster?
Gibt es einen besseren Weg, um zu erreichen, was ich will - erstellen Sie eine Schnittstelle, die Klasse erzwingen Result Eigenschaft und Execute Methode -?

+3

Es ist auch nicht sinnvoll, in erster Linie machen eine Schnittstelle für eine Reihe von verschiedenen Methoden zu haben, die alle haben unterschiedliche Signaturen * *. Das vereitelt den gesamten Zweck einer Schnittstelle. Entweder * stellen Sie sicher, dass alle Methoden die gleiche Signatur * verwenden, oder * verwenden Sie keine Schnittstelle *, weil Sie nichts daraus erhalten. – Servy

Antwort

0

Wie @Servy kommentiert, und für eine korrekte Signatur; Ich fand meine Lösung wie folgt aus:

public interface IProcessInput 
{ 
} 

public interface IProcessable<in TInput, out TOutput> where TInput : IProcessInput 
{ 
    TOutput Result { get; } 

    TOutput Execute(TInput args); 
} 

public abstract class ProcessInput: IProcessInput 
{ 
    protected ProcessInput(int count) 
    { 
     Count = count; 
    } 

    public virtual int Count { get; private set; } 
} 

public class WithoutProcessInput : ProcessInput 
{ 
    public WithoutProcessInput() : base(0) 
    { 
    } 
} 

und so weiter ...

Verwandte Themen