2009-03-17 5 views
2

これはおそらく非常に簡単ですが、私は困惑しています。私は自分のプログラムで何度も使用される汎用クラスを作りたいと思っています。私はこれが非常に軽量で超高速になりたい。インスタンス内のクラス内のメソッドをどのように定義しますか?

C#で非常に簡単な例について

:私はルナ()とRunB()は、このクラスをインスタンス化オブジェクトによって定義され、制御されたい

public class SystemTest 
{ 
    public TestMethod(string testString) 
    { 
     if(testString == "blue") 
     { 
     RunA(); 
     } 
     else if(testString == "red") 
     { 
     RunB(); 
     } 
     else if(testString == "orange") 
     { 
     RunA(); 
     } 
     else if(testString == "pink") 
     { 
     RunB(); 
     } 
    } 

    protected void RunA() {} 
    protected void RunB() {}  
} 

。 RunA()とRunB()が何をしているかを理解するために、SystemTestクラスをインスタンス化するオブジェクトに完全に依存します。これどうやってやるの?

私はインスタンスオブジェクトがこのSystemTestクラスを常に継承しないようにしたいので、すばやく実行したいと思います。私が考えているのは、複雑なプロセッサ集中型のものだけです。私はこれを行う簡単な方法があることを知っています。


編集:一般的に、以下の回答の方が速く、デリゲートまたはインターフェイスメソッドが実行されますか?

答えて

6

インターフェイスを望むようにそれは次のように、聞こえる:

interface ITestable { 
    void RunA(); 
    void RunB(); 
} 

、あなたは(SystemTest ctorの、またはTestMethodのいずれか)であること渡します。呼び出しクラスは(例えば)ITestableを実装し、TestMethod(this、someString)を呼び出すことができます。

また、拡張メソッドですか? btw、string argはおそらく列挙型ですか?

public interface ITestable { 
    void RunA(); 
    void RunB(); 
} 
public static class SystemTest 
{ 
    public static void TestMethod(this ITestable item, string testString) 
    { 
     if(testString == "blue") 
     { 
     item.RunA(); 
     } 
     else if(testString == "red") 
     { 
      item.RunB(); 
     } 
     else if(testString == "orange") 
     { 
      item.RunA(); 
     } 
     else if(testString == "pink") 
     { 
      item.RunB(); 
     } 
    } 
} 

その後、発信者は、単にITestableを実装し、誰もがインスタンスfooためfoo.SomeMethod(color);を呼び出すことができます。

+0

+1インターフェイス... –

8

次のことが可能です。

public class SystemTest 
{ 
    Action RunA; 
    Action RunB; 
    public SystemTest(Action a, Action b) 
    { 
     RunA = a; 
     RunB = b; 
    } 
    //rest of the class 
} 
0

、青、赤、オレンジ、ピンクなどの限られた色の選択肢がある場合。あなたは

public enum Color 
{ 
    Blue, 
    Red, 
    Orange, 
    Pink 
} 

のような列挙型を作成し、解決策のいずれかが、ここで言及してswitch文でこの列挙を使用することができます。コンパイラは、パフォーマンスを必要とするため、列挙型を整数&として扱います。整数比較は文字列比較よりも効率的です。

switch (color) 
{ 
case Color.Blue: 
case Color.Orange: 
        RunA(); 
        break; 
case Color.Red: 
case Color.Pink: RunB(); 
        break; 
} 
0

もう1つのオプションは、RunAとRunBをメソッドではなくイベントに変更することです。 .netのイベントはかなり軽量で速く、各インスタンス/使用法の振る舞いを定義するために新しいクラスを構築する必要なしに、使用モデルと潜在的に一致します。

インスタンス化されたベースの動作が必要な場合は、デリゲートまたはイベントを使用するか、単一の基本クラスまたはインターフェイスを渡して直接メソッドを呼び出す必要があります。

0

イベントとしてRunA、RunBメソッドを公開して、呼び出し元が任意の呼び出し元にアタッチできるようにします。例:

public class SystemTest 
{ 
    public TestMethod(string testString) 
    { 
     if(testString == "blue") 
     { 
     RunA(); 
     } 
     else if(testString == "red") 
     { 
     RunB(); 
     } 
     else if(testString == "orange") 
     { 
     RunA(); 
     } 
     else if(testString == "pink") 
     { 
     RunB(); 
     } 
    } 

    protected event Action RunA; 
    protected event Action RunB;  
} 
0

必要なものがすべてデータ構造の場合、なぜクラスを使用するのですか?

Dictionary<string, Action> MethodMap = new Dictionary<string, Action> 
{ 
    { "red", RedMethod }, 
    { "blue", BlueMethod }, 
    { "green", GreenMethod }, 
    { "yellow", YellowMethod } 
}; 

次に、メソッドを実行するためのクラスは必要ありません。単純に

Method[key]; 

となります。

+0

ummは完全な強力なタイピング経験ですか? –

関連する問題