2012-01-15 18 views
1

私はいくつかのクラスで使用されているインターフェイスを持っており、インターフェイスの実装はすべてのクラスで同じです。私はそれを基本抽象クラスにしますが、その後、それは、派生クラスが後で別のクラスから継承するのを止めます。したがって、すべてのクラスで同じインターフェイスを再実装する代わりに、.hファイルのように1つの場所にインターフェイスを実装して、クラスがインターフェイスを実装するように.hファイルをcsファイルにインクルードすることはできますか。インターフェイスをC#で.hファイルに実装できますか?

ところで、インターフェイスはほとんどがプロパティで構成され、代理人に変更されました。

+3

本当の答えを書く時間がありませんが、インターフェースには拡張メソッドがあります。これはあなたが探しているものに合うかもしれませんが、あなたがやろうとしていることに依存します –

+0

@ 32bitkidありがとう、私は見ていきます。 – mihajlv

+0

拡張メソッドがあなたのケースでそれをカットしない場合は、インターフェイス実装を別のクラスに分解してください。これは、いくつかのクラスのうちの1つのラップされたオブジェクトへの参照を保持します。何をしようとしているかに応じて、ラップされたオブジェクトへのアクセスを提供することができます。 IServiceProviderを介して。 –

答えて

1

私はC#の上の少し錆びてるので、確かにこれを行うのC#の固有の方法があるかもしれません。しかし、より一般的な意味では、独自の標準クラスファイルで実装を提供することができます。インターフェイスを実装する必要のある各クラスについては、インターフェイスメソッドを宣言する必要がありますが、長い実装がそれぞれにコピーアンドペーストされるのではなく、共有の「インクルード」実装に対して1行の呼び出しを行うことができます。

(これはおそらく最良の解決策ではありませんが、少なくともあなたが開始得ることができる実行可能なものでなければならない。)

+0

余分な割り当てを避けるために、クラスの代わりに構造体を使うことをお勧めします。 – chuckj

1

EDIT:コメントのとおり、すべての行の下にスクラッチがあります。これはおそらくあなたが望むものではありません。

残念ながら、mixinは、PostSharpのようなポストコンパイルツールを含むいくつかの疑わしい技術を除いて、C#の組み込み言語機能として利用できません。一部のIoCツールでは、mixinのようなことも起こります(Best implementation of INotifyPropertyChange ever参照)。

@ 32bitkidのポイントには、extension methodsと書くことができます。それらはインタフェースではありませんが、その型の外側の型に動作の実装を適用することができます。たとえば、あなたが書くことができます。

public static class IPersonExtensions { 
    // Note use of this keyword 
    public static Int32 GetAge(this IPerson p) { return DateTime.Now - p.BirthDate; } 
} 

を、次にようにそれを使用する:

var p = new Person(...); 
var pAge = p.GetAge(); 

をはい、それは彼らが.csファイルのファイルではなく、.hファイルを取得するのにインタフェースが正常にused-されている方法です。あなたは、クラスと同じように、それ自身のファイルにインターフェイスを定義し、そのクラスをインターフェイスの実装として宣言することができます。 ConcreteFoo.csで

public interface IFoo { 
    public String Bar { get; set; } 
} 

、次いで:IFoo.cs、例えば

public class ConcreteFoo : IFoo { 
    // This property implements IFoo.Bar 
    public String Bar { get; set; } 
} 

(これは、方法によってauto-implemented propertyの一例である)

IFoo技術的にはそれ自身のファイルである必要はありません。それはどの.csファイルにもあり得ます。慣例により、それは通常自分のものです。また、インターフェイスにIプレフィックスを使用する規則に注意してください。あなたは、たとえばここに、これについての詳細を読みたいかもしれません

http://www.csharp-station.com/Tutorials/Lesson13.aspx

+1

opはミックスインを書く方法を知りたいのであって、一般にインターフェイスを使う方法ではありません。 –

+0

ああ、ワックスの別のボールです...編集... –

1

C#はヘッダファイルの概念がありません。 C#でこれを簡単に行うことはできません。インターフェイスを実装し、別のクラスで同じ実装を使用する場合、もう一方のクラスは実装クラスから派生する必要があります。

例:

public interface IFoo 
{ 
    void DoSomething(); 
} 

public class SomeClass : IFoo 
{ 
    public void DoSomething() 
    { 
    } 
} 

あなたが今、あなたがSomeClassからSomeOtherClassを引き出すか、それを再実装またはSomeClassのインスタンスにDoSomethingへの呼び出しを委任する必要がSomeClassと同じ実装を持っているSomeOtherClassを持っているしたい場合。もう一つの選択肢は、mixinスタイルをサポートできるDynamicProxyのようなツールを使うことです。

0

基本的にC#ではサポートしていない複数の継承が必要ですが、別のクラスから既に派生している他のクラスのインターフェイス実装を引き続き使用できます。私が思いついた一つの方法は、partial classesT4 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を生成することも可能でしょう。

関連する問題