2011-03-20 38 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擴展方法。