Delphiでは、インターフェイスの実装を別のクラスに委任できますが、これがC#で可能かどうか疑問に思っていますか?
たとえば、私はインターフェイスIMyInterfaceを持っていて、TMyClassはIMyInterfaceを実装していると言います。しかし実際にはそうではありません。内部的には、implementsキーワードを使用して、TMyClassのすべてのメソッドを宣言しなくても、インターフェイスの実装を別のクラスに委任できます。
簡単な答えがあります:いいえ、C#はDelphiと同じようにそれを許可していません。
C#は知っているが、Delphiは知らない場合は、次のようになります。http: //docwiki.embarcadero.com/RADStudio/en/Implementing_Interfaces、「委任によるインターフェイスの実装(Win32のみ)」セクションを参照してください。
メソッド呼び出しを手動でインターフェースに渡す必要があると思います。私のC#は少し錆びています(私はまだそれを非常によく読むことができます):
public class Blah : ISomeInterface
{
public ISomeInterface implementer { getter and setter here }
public int ISomeInterface.DoThis()
{
if (implementer) return implementer.DoThis();
}
public void ISomeInterface.DoThat(int param)
{
if (implementer) implementer.DoThat(param);
}
etc...
そのメソッドはDoThis
、によって実装する必要があります。C#では、これらの各メソッドを含まれているインターフェイスに明示的に委任する必要があります。Delphiでは、またはタイプのプロパティの後にキーワードを使用すると、これが自動的に実行されます(つまり、メソッドが生成され、バックグラウンドで呼び出されます。ユーザーには見えません) 。DoThat
ISomeInterface
Blah
implements
class
interface
一部の回答者は、C#では異なる意味を持つ用語implements
と の使用に混乱していると思います。delegation
実用的な方法はないと思います。実装クラスを抽象クラスとして記述できますが、最初のクラスをインスタンス化できなくなるため、非常に扱いにくくなります。唯一の方法は、次のような醜い空の仮想メソッドを作成することです。
public interface ISomething
{
void DoOne();
void DoTwo();
}
public class Something : ISomething
{
public virtual void DoOne() { }
public virtual void DoTwo() { }
}
しかし、これは悪いクラス設計IMOです。そもそも実装クラスを抽象化する必要があるため、偽のインターフェイスを実装するクラスのインスタンスをインスタンス化することはできません。
したがって、適切な方法は、「abstract」クラス内にインターフェースを部分的に実装し、他のクラスを抽象としてマークすることによって継承クラスに委任することです(実装する派生クラスまで)。
つまり
public interface ISomething
{
void DoOne();
void DoTwo();
}
public abstract class Something : ISomething
{
public abstract void DoOne();
public abstract void DoTwo();
}
このように、不安定な「Something」クラスを直接インスタンス化することはできませんが、まだ実装されていないインターフェイスの抽象メソッドを実装するには、派生クラスが必要です。これははるかに堅牢で安全です。
注意すべき点として、実装しているのが独自のインターフェースである場合は、それを破棄してください。インターフェイスを抽象クラスとして記述し、いくつかのメソッドを最初に実装して、はるかに簡単にします。
部分的なクラスを使用できます:
// SomeThing.cs
public partial class SomeThing
{
// your interface independant part
}
// SomeThing.ISomeThing.cs
public partial class SomeThing: ISomeThing
{
// ISomeThing implementation
}
これらの2つのファイルは同じアセンブリにある必要があります。それらはコンパイラによって単一のクラスに結合されます。
部分クラスを使用できます。これにより、実装を別のファイルに配置する可能性が得られます。クラスの両方の部分が同じアセンブリに含まれている必要があります。
Class1.cs
public partial class Class1: IInterface {}
Class1Impl.cs
public partial class Class1 { /*implementation */ }
私はあなたがやりたいことをする別の方法を私の心の中で想像することはできません。カプセル化を使用するだけです=)それは実際に必要なものではありません。いくつかのスタブプロキシメソッドを作成する必要があります。
C#では、継承を介する場合を除いて、クラスのインターフェイスの実装を委任することはできません(Nikola Anusevからの回答を参照)。
ただし、部分的なクラス定義を使用して、インターフェイスの実装をクラスの残りの部分から分離することができます。
1つの(MyClass.Specific.cs)ファイルに次のものがあります。
public partial class MyClass
{
void MySpecificMethod() {...}
}
また、他のファイル(MyClass.IMyInterface.cs)には、クラス固有のメソッドしかありません。
public partial class MyClass : IMyInterface
{
void IMyInterface.MySpecificMethod() {...}
}
MyClassにはまだすべてのメソッドがありますが、個別のファイルにあります。