2011-03-20 37 views
1

是否有可能以某种方式简化界面?目标是为将要使用它的用户提供降噪API。C# - 简化界面

一个例子可能是界面IFoo有25个定义的方法,我只想向用户公开其中的5个,我该如何以巧妙和优雅的方式做到这一点?

+0

不,你不能只显示部分方法 - 这是全部或没有。考虑有两个接口。 – 2011-03-20 16:03:17

+0

您可以将该示例添加到旧问题中,而不是创建新问题。 – CodesInChaos 2011-03-20 16:04:39

回答

7

你不能。根据定义,接口在所有方法上都是公共的。这就是为什么它被称为合同。

尝试拆分成多个接口:

IBaseFoo (5 methods) 
    IFoo : IBaseFoo (20 more methods) 

这是它是如何普遍实行。但是,除非您将IFoo设为专用接口,否则无法阻止用户表单了解其他20种方法。

然后你写一个包装类,它只是向用户公开IBaseFoo。 IFoo可以直接投射到IBaseFoo中返回给用户。

+0

你认为它值得吗?创建一个包装类仅仅是为了减少用户可以调用的方法的数量? – ebb 2011-03-20 16:35:14

+0

@ebb,取决于你。如果你想从用户隐藏这些方法,可能应该。如果您只想为临时用户设置“标准”,为高级用户设置“高级”,则只需使用两个接口,一个从另一个继承。 – 2011-03-20 17:03:08

0

您创建的接口只包含这五种方法,并从中派生出IFoo

0

创建接口的简化版本,该接口只指定希望用户有权访问的方法,让更大的接口从中继承,并且只将基本接口公开给用户。

或者使用更少的方法创建一个包装类,并只将它公开给用户。

0

某些接口可以通过将某些方法移至扩展方法来简化。适用于特定类型的界面 - 如前所述 - 没有通用的方法来缩小任何界面。

与预计在非常特定的方式来实施等多种方法接口:

interface IMy 
{ 
    int GetFoo(string name); // calls GetFoo(name, DefautlFoo, DefaultBar) 
    int GetFoo(string name, string foo); // calls GetFoo(name, foo, DefaultBar) 
    int GetFoo(string name, string foo, string bar); 
} 

可以转换一个方法和2扩展方法的接口:

interface IMy 
{ 
    int GetFoo(string name, string foo, string bar); 
} 

static class MyExtensions 
{ 
    int GetFoo(this IMy my, string name) 
    { 
     return my.GetFoo(name, DefaultFoo, DefaultBar); 
    } 
} 

有可能是一些接口成员可以从接口移出到扩展方法的一些不那么简单的情况。即参见http://msdn.microsoft.com/en-us/vcsharp/bb625996.aspx,例如扩展具有额外功能的接口而没有changin接口或查看IEnumerable的LINQ扩展方法。