人々はどのようにC#でmixinスタイルの再利用を得るのですか?
-
03-07-2019 - |
質問
テンプレートミックスインを使用して、渡されるテンプレートパラメータであるFinalClassを参照するコードを記述できるC ++のバックグラウンドから来ました。これにより、再利用可能な関数を「ミックスイン」することができます。 MyFinalClassのテンプレートパラメータを使用してReusableMixinから継承するだけで、任意の派生クラスに。これはすべてクラスにインライン化されるため、すべてを行う大きなクラスを作成したように見えます。つまり、非常に高速です。ミックスインは連鎖できるため、あらゆる種類の動作(および状態)を1つのオブジェクトにミックスインできます。
技術の説明が必要な場合は、お問い合わせください。私の質問は、C#でそのような再利用をどのように取得できますか?注:C#ジェネリックは、ジェネリックパラメーターからの継承を許可しません。
解決
C#では、C ++スタイルのミックスインに最も近いのは、クラスのフィールドとしてミックスインを追加し、クラスに転送メソッドを追加することです
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();
}
}
機能のインポートのみが必要な場合、通常これで十分です&ミックスインの状態。もちろん、ミックスインは(プライベート)フィールド、プロパティ、メソッドなどを備えて、好きなように実装できます。
クラスで「is-a」を表現する必要がある場合ミックスインとの関係は次のようにする必要があります:
interface IMixin1
{
int Property1 { get; set; }
}
interface IMixin2
{
void Do2();
}
class MyClass : IMixin1, IMixin2
{
// implementation same as before
}
(これは、C#で多重継承をエミュレートする標準的な方法でもあります。)
もちろん、ミックスインインターフェイスとミックスインクラスはジェネリックにすることができます。最も派生したクラスパラメーターなどを使用します。
他のヒント
インターフェイスと拡張メソッドを使用できます。例:
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を継承することで、ミックスインを使用できるようになりました。 (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。
C#では、" partial"を使用できます。クラスが複数のソースファイルに実装されていることを示すキーワード。その後、小さなテンプレートツールを使用して、クラスに注入するメソッドを含む追加のソースコードファイルを自動生成できます。
Visual Studioに含まれているT4テンプレートツールを使用してこれを実行できますが、より単純なアプローチを使用できます。独自のテンプレートエンジンを参照してください: http://myxin.codeplex.com/
.aのリミックスライブラリを http://remix.codeplex.com で確認してください
このライブラリは.NETにミックスインを提供します
拡張方法はシナリオに役立ちますか?