1

私のシステムでは、統計に同様に使用される 16 の異なるクラスがあります。それらは次のようになります

public class myClass : myInheritage
{
    private static myClass _instance;

    public static myClass  Instance
    {
        get { return _instance ?? (_instance = new myClass(); }
    }

    public static void Reset()
    {
        _instance = null;
    }
}

それらはすべてシングルトンに作られています

myInheritage は次のようになります。

public class myInheritage
{
    int data = 0;

    public myInheritage()
    {
    }

    public int Data
    {
        get { return data; }
        set { data+= value; }
    }
}

プログラムが作成されるので、ユーザーは統計を作成するクラスを選択します。

このようなものは私が欲しいものです

    public void statistics(Object myObject, string name)
    {
        Object x = myObject;

        x.Data = 10;

        x.Data();
    }

別のクラスから呼び出された

    statistics(myClass.Instance, "myClass");
    statistics(myClass2.Instance, "myClass2)";

したがって、統計クラスでインスタンスを動的に変更したいと考えています。

それは .NET 2.0 で可能ですか?

4

2 に答える 2

1

リフレクションを使用できます...

MethodInfo method = myObject.GetType().GetMethod("Reset");
if (method != null) method.Invoke(myObject, null);

クラス自体を変更できる場合は、それぞれにインターフェイス (または基本クラス) を実装させることをお勧めしますIResettable

public interface IResettable
{
    void Reset();
}

public class myClass : myInheritage, IResettable
{
    public void Reset() { ... }
}

次に、インターフェイスに対して関数を記述できます。

public void statistics(IResettable myObject, string name)
{
    myObject.Reset();
}
于 2012-11-30T08:54:04.827 に答える
1

はい。ここで必要なのは、Strategy/Factory パターンです。あなたの場合に合わせて使用​​できるので、両方に名前を付けます。ここにはこれらのデザイン パターンの優れた例があり、以下はStrategy パターンFactory パターンの詳細な紹介です。最後の 2 つのリンクの前者は、2 つを組み合わせて必要な処理を正確に実行する方法も示しています。

したがって、あなたの場合、次のインターフェースを設定できます

public interface IStatistics
{
    // Some method used by all classes to impose statistics.
    void ImposeStatistics();
}

次に、シングルトンクラスで持つことができます

public class myClass : myInheritage, IStatistics
{
    private static myClass _instance;

    public static myClass  Instance
    {
        get { return _instance ?? (_instance = new myClass()); }
    }

    public static void Reset()
    {
        _instance = null;
    }

    // You would also inherit from IStatistics in your other classes.
    public void ImposeStatistics()
    {
        // Do stuff.
    }
}

次に、実行時に戦略を課す「ファクトリー」クラスを作成します。

public static class StatisticFactory 
{
    public static void ImposeStatistics(IStatistics statsType)
    {
        statsType.ImposeStatistics();
    }

    /// <summary>
    /// Get the conversion type.
    /// </summary>
    /// <param name="col">The column to perform the conversion upon.</param>
    public static IStatistics GetStatsType(string typeName)
    {
        switch (typeName)
        {
            case "BoseEinstein":
                return new BoseEinsteinStats();
            case "FermiDirac":
                return new FermiDiracStats();
            default:
                return null;
        }
    }
}

次に、これを次のように呼び出すことができます

// Run stats.
IStatistics stats = StatisticFactory(GetStatsType("BoseEinstein"));

必要なクラスの統計を取得します。

これが役立つことを願っています。

于 2012-11-30T08:55:13.657 に答える