あなたの状況を少し例えます。
あなたは小型車を修理する小さな会社を経営しています。
あなたは、外交艦隊のあらゆる種類の車両 (飛行機、ボート、大型トラック、小型車) の修理サービスを必要とする政府と契約を結びます。
あなたは嘘をついた / あなたが一般化した瞬間に小さな間違いを犯した
1)実装に成功したため
void Repair(SmallCar vehicle)
2) そしてその理由
class SmallCar : Vehicle { }
class Airplane : Vehicle { }
class Boat : Vehicle { }
class BigTruck : Vehicle { }
どういうわけか、ポイント(1 + 2)の組み合わせ=>ポイント3は次のように述べています:
3) 政府はあなたの小さな会社を安全に「何でも修理する人たち」と呼ぶことができます。
Airplane protocolPlane = new Airplane();
yourCompany.Repair(protocolPlane);
もちろん、これは正しくありません: (1 + 2) は (3) を意味しません。
これが実行時例外ではなく、コンパイラ エラーとして終わったのは良いことです。このようにして、アーキテクチャの小さな問題についてより早く知ることができます。
編集
コードで、 SomeClassクラスに両方のインターフェイスを実装する必要があると判断し、その方法がわからない場合は、次のように明示的なインターフェイス実装を使用できます。
public class SomeClass : IContract, IContract<SomeContractClass>
{
// Method of IContract<SomeContractClass>
public void Definition(SomeContractClass data)
{
Console.WriteLine("Processing a SomeContractClass instance");
// ...etc
}
// Method of IContract hence of IContract<object>
void IContract<object>.Definition(object data)
{
if (data is SomeContractClass)
this.Definition(data as SomeContractClass);
else
{
string descriptor = (null == data)
? "A null reference"
: "An instance of " + data.GetType().Name";
Console.WriteLine("Processing something other than a SomeContractClass instance: " + descriptor);
// ...etc
}
}
}
このようにして、次の結果が正常に得られます。
class Program {
public static void Main(string[] args) {
SomeClass someInstance = new SomeClass();
IContract<SomeContractClass> first= someInstance;
IContract second = someInstance;
someInstance.Definition(new SomeContractClass());
// prints out "Processing a SomeContractClass instance"
first.Definition(new SomeContractClass());
// prints out "Processing a SomeContractClass instance"
second.Definition(new SomeContractClass());
// prints out "Processing a SomeContractClass instance"
second.Definition( "something else" );
// prints "Processing something other
// than a SomeContractClass instance: An instance of String"
second.Definition( 123 );
// prints "Processing something other
// than a SomeContractClass instance: An instance of Int32"
first.Definition( true );
// doesn't compile saying that bool can't be converted to SomeContractClass
}
}
編集の終わり