2016-08-23 45 views
0

我必須在某些類型的對象上添加Diff功能。我想提出一個界面,它將定義能夠將自己與其他相同類型的對象進行比較的對象。我們稱之爲IDiffable。現在我們可以在接口定義中引用具體類型(不管它們可能是什麼)嗎?

interface IDiffable 
{ 
DiffDetails CompareWith(object other); 
} 

的問題是,在CompareWith方法用戶可以在任何類型包括實現IDiffable的那些,並且不需要的那些通過。所以讓我們將它們限制爲實現IDiffable的那些。

interface IDiffable 
{ 
DiffDetails CompareWith(IDiffable other); 
} 

現在剩下的只是拼圖的最後一塊,用戶仍然可以通過在不同類型的不是一個呼叫正在以取得的對象。我如何限制?

這是我想要防止的一個例子。

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 diff = a.CompareWith(b); // incorrect usage, how to avoid this? 

我想只允許以下

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

什麼你要找的是埃裏克利珀在[奇妙而又奇妙(https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/描述) –

回答

2

您可以使用泛型做到這一點。

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"; 
    } 
} 

它有點混亂,因爲你必須在類定義中聲明兩次類型。當您開始分類或對泛型進行更復雜的限制時,它也可能很快變得笨拙。

但是,上面的代碼實現了你想要的。

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