2016-08-23 9 views
0

特定の種類のオブジェクトにDiff機能を追加する必要があります。私は、同じタイプの他の人と自分自身を比較できるオブジェクトを定義するインタフェースを考え出したいと思います。それをIDiffableとしましょう。インタフェース定義の中の具体的なタイプ(何でも構いません)を参照できますか?

interface IDiffable 
{ 
DiffDetails CompareWith(object other); 
} 

今の問題は、ユーザーがIDiffableを実装したものとそうでないものも含め、あらゆるタイプに渡すことができCompareWith方法で、あります。ですから、IDiffableを実装するものに制限しましょう。

interface IDiffable 
{ 
DiffDetails CompareWith(IDiffable other); 
} 

は今で残っているパズルの最後の一枚は、ユーザーがまだに行われている1回のコールとは異なる種類のオブジェクトに渡すことができます。それをどのように制限するのですか?

これは私が防止したいものの例です。

internal class TypeA : IDiffable 
{ 
internal DiffDetails CompareWith(IDiffable obj) 
{ 
    // compare here 
} 
} 

internal class TypeB : IDiffable 
{ 
internal DiffDetails CompareWith(IDiffable obj) 
{ 
    // compare here 
} 
} 

私は、私はあなたがこの使用してジェネリックを行うことができる唯一の次

var a = new TypeA(); 
var b = new TypeB(); 
var another_a = new TypeA(); 
var diff = a.CompareWith(another_a); // Correct usage 
+0

あなたはエリックリペットで[CuriouserとCuriouser](https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/によって記述されて探しています) –

答えて

2

を許可する次

var a = new TypeA(); 
var b = new TypeB(); 
var diff = a.CompareWith(b); // incorrect usage, how to avoid this? 

を避けたいです。

interface IDiffable<T> 
{ 
    string Diff(IDiffable<T> obj); 
} 

class DiffA : IDiffable<DiffA> 
{ 
    public string Diff(IDiffable<DiffA> obj) 
    { 
     return "Diffable A"; 
    } 
} 

class DiffB : IDiffable<DiffB> 
{ 
    public string Diff(IDiffable<DiffB> obj) 
    { 
     return "Diffable B"; 
    } 
} 

あなたのタイプをクラス定義で2回記述する必要があるので、少し面倒です。また、サブタイプを開始したり、ジェネリックでより複雑な制限を行うと、すぐに扱いにくくなる可能性があります。

しかし、上記のコードは、あなたが望むものを実現します。

static void Main(string[] args) 
{ 
    var a = new DiffA(); 
    var b = new DiffB(); 
    a.Diff(a); // Runs fine 
    a.Diff(b); // Compiler error 
} 
関連する問題