基本的にC#ではサポートしていない複数の継承が必要ですが、別のクラスから既に派生している他のクラスのインターフェイス実装を引き続き使用できます。私が思いついた一つの方法は、partial classesとT4 Text Templatesです。これはわずかなハックですが、派生クラスの多くで同じインターフェイス実装をコピー/貼り付けするよりも優れています。以下の簡単な例である:
IInterface.cs
public interface IInterface
{
void Foo();
}
InterfaceImpl.cs
public partial class InterfaceImpl : IInterface
{
public void Foo()
{
Console.WriteLine("Foo");
}
}
BaseClass.cs
using System;
public class BaseClass
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
DerivedClassA.cs
public partial class DerivedClassA : BaseClass, IInterface
{
public void FooBar()
{
this.Foo();
this.Bar();
}
}
DerivedClassAInterfaceImpl.tt
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<# var codeText = System.IO.File.ReadAllText(this.Host.ResolvePath("InterfaceImpl.cs")).Replace("InterfaceImpl", "DerivedClassA"); #>
<#= codeText #>
DerivedClassB.cs
public partial class DerivedClassB : BaseClass, IInterface
{
public void BarFoo()
{
this.Bar();
this.Foo();
}
}
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".cs" #>
<# var codeText = System.IO.File.ReadAllText(this.Host.ResolvePath("InterfaceImpl.cs")).Replace("InterfaceImpl", "DerivedClassB"); #>
<#= codeText #>
DerivedClassBInterfaceImpl.ttこれが欲しい各派生クラスのTTファイルを作成する必要があること少し迷惑なんですInterfaceImpl.csが数行以上の場合はコピー/ペーストコードを保存しますコードの1つのttファイルを作成し、すべての派生部分クラスの名前を指定してmultiple filesを生成することも可能でしょう。
本当の答えを書く時間がありませんが、インターフェースには拡張メソッドがあります。これはあなたが探しているものに合うかもしれませんが、あなたがやろうとしていることに依存します –
@ 32bitkidありがとう、私は見ていきます。 – mihajlv
拡張メソッドがあなたのケースでそれをカットしない場合は、インターフェイス実装を別のクラスに分解してください。これは、いくつかのクラスのうちの1つのラップされたオブジェクトへの参照を保持します。何をしようとしているかに応じて、ラップされたオブジェクトへのアクセスを提供することができます。 IServiceProviderを介して。 –