4

私はテンプレート ミックスインを使用して、渡されるテンプレート パラメーターである FinalClass を参照するコードを記述できる C++ のバックグラウンドを持っています。 MyFinalClass のテンプレート パラメータを使用します。これはすべてクラスにインライン化されるため、すべてを実行する大きなクラスを作成したかのようになります。つまり、非常に高速です。ミックスインは連鎖できるので、あらゆる種類の動作 (および状態) を 1 つのオブジェクトに混在させることができます。

テクニックについて説明が必要な場合は、質問してください。私の質問は、C# でそのように再利用するにはどうすればよいですか? 注: C# ジェネリックでは、ジェネリック パラメーターからの継承は許可されていません。

4

5 に答える 5

12

インターフェイスと拡張メソッドを使用できます。例えば:

public interface MDoSomething // Where M is akin to I
{
     // Don't really need any implementation
}

public static class MDoSomethingImplementation
{
     public static string DoSomething(this MDoSomething @this, string bar) { /* TODO */ }
}

これで、MDoSomething から継承して mixin を使用できるようになりました。(this) クラス内で拡張メソッドを使用するには、this 修飾子が必要です。例えば:

public class MixedIn : MDoSomething
{
    public string DoSomethingGreat(string greatness)
    {
         // NB: this is used here.
         return this.DoSomething(greatness) + " is great.";
    }
}

public class Program
{
    public static void Main()
    {
        MixedIn m = new MixedIn();
        Console.WriteLine(m.DoSomething("SO"));
        Console.WriteLine(m.DoSomethingGreat("SO"));
        Console.ReadLine();
    }
}

HTH。

于 2009-01-05T09:29:48.793 に答える
4

C# では、C++ スタイルの mixin に最も近いのは、mixin をクラスのフィールドとして追加し、一連の転送メソッドをクラスに追加することです。

public class MyClass
{
    private readonly Mixin1 mixin1 = new Mixin1();
    private readonly Mixin2 mixin2 = new Mixin2();

    public int Property1
    {
        get { return this.mixin1.Property1; }
        set { this.mixin1.Property1 = value; }
    }

    public void Do1()
    {
        this.mixin2.Do2();
    }
}

ミックスインの機能と状態のみをインポートする場合は、通常これで十分です。mixin はもちろん、(プライベート) フィールド、プロパティ、メソッドなどを完備して、好きなように実装できます。

クラスがミックスインとの「is-a」関係も表現する必要がある場合は、次のことを行う必要があります。

interface IMixin1
{
    int Property1 { get; set; }
}

interface IMixin2
{
    void Do2();
}

class MyClass : IMixin1, IMixin2
{
    // implementation same as before
}

(これは、C# で多重継承をエミュレートする標準的な方法でもあります。)

もちろん、ミックスイン インターフェイスとミックスイン クラスはジェネリックにすることができます。たとえば、最も派生したクラス パラメータなどを使用できます。

于 2009-01-05T08:12:00.667 に答える
2

C# では、"partial" キーワードを使用して、クラスが複数のソース ファイルに実装されていることを示すことができます。次に、小さなテンプレート ツールを使用して、クラスに挿入するメソッドを含む追加のソース コード ファイルを自動生成できます。

Visual Studio に含まれている T4 テンプレート ツールを使用してこれを行うことができますが、より単純なアプローチを使用することもできます。私自身のテンプレート エンジンを参照してください: http://myxin.codeplex.com/

于 2010-01-10T13:23:39.393 に答える
1

http://remix.codeplex.comで .net のリミックス ライブラリを確認してください。

このライブラリはミックスインを .NET にもたらします

于 2011-04-26T06:06:40.447 に答える
0

拡張メソッドはあなたのシナリオに役立ちますか?

于 2009-01-05T06:19:47.880 に答える