2016-08-23 48 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 
} 
相关问题