は:すべてのインターフェイスを継承チェーンに含める必要がありますか?私は2つのインターフェイスがある場合
interface IGrandparent
{
void DoSomething();
}
interface IParent : IGrandparent
{
void DoSomethingElse();
}
をその後、2つの実装があります。
//only includes last interface from the inheritance chain
public class Child1 : IParent
{
public void DoSomething()
{
throw new NotImplementedException();
}
public void DoSomethingElse()
{
throw new NotImplementedException();
}
}
// includes all the interfaces from the inheritance chain
public class Child2 : IGrandparent, IParent
{
public void DoSomething()
{
throw new NotImplementedException();
}
public void DoSomethingElse()
{
throw new NotImplementedException();
}
}
は、これらの2つの実装は同じではありますか? (クラス名を除く)?何人かは「暗黙的かつ明示的な実装」と関係があると言いますが、なぜその理由を説明するのでしょうか?私はChild2様式を他のものよりも多く見ました。
「同一」は明確に定義されていません。 Err、それはよく定義されていて、そうではありません。しかし、すべての実用的な目的のために、 'interface IB:IA'の場合、' class B:IB 'と比較して 'class B:IB、IA'と書いても意味がありません。唯一の違いは、誰かが後に 'IA'から継承する' IB' *を*変更しなかった場合です。それは違いを生み出すでしょう。しかし、通常は設計時に心配することはありません。ちょうど 'IParent'を実装してください。 –
Child2のスタイルがより頻繁に見られる場合は、どうして内部的にどうなるのかを確かめてください。私はそれの利点の多くを見ていないが、多分誰かが明らかにすることができます。明確化が意味をなさない場合は、ここに再度お尋ねください。しかし、例えばMSは明示的に宣言していない。一覧 ':IEnumerableを' https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs –
それは文体の選択である、あなたは、あなたのチームのコーディング標準がそれを必要とするなら、「はず」。明示的な実装と明示的な実装は関係がありません。どちらのスタイルでも、インターフェースに共通のメンバー名がある場合は明示的に要求されます。コーディングの標準を一切使わずに作業していて、好みがない場合は、マイクロソフトのプログラマが行う方法、つまり2番目のスタイルを実行してください。 –