2009-04-29 151 views
3

比方說,我寫了一個真正的踢屁股界面。所以,實際上,我需要使用一些內置類型來實現它們,所以無論使用此接口編寫的代碼都可以使用內置類型。有什麼辦法讓現有類型實現一個接口?

public interface IKickAss 
{ 
    int Yeahhhhhhh() { get; } 
} 

public static class Woot 
{ 
    public int Bar(IKickAss a, IKickAss b) 
    { 
     return a.Yeahhhhhhh - b.Yeahhhhhhh; 
    } 
} 

// What I'd like to do, sort of. 
public partial struct Int32 : IKickAss 
{ 
    public int Yeahhhhhhh 
    { 
     get 
     { 
      return this; 
     } 
    } 
} 

我想這麼多次,原因很多。最近的是我爲「uint」實現了基數排序,但也創建了一個簡單的「IRadixSortable」接口,它需要屬性「uint RadixKey {get}」。這意味着我已經基本上重複了排序代碼:一次爲uint數組,另一次爲IRadixSortable數組。我寧願寫一個通過使uint類型實現IRadixSortable。有沒有辦法做到這一點...也許使用反射?

Haskell可以做到這一點(即類型類可以隨時在任何數據類型上實例化),我認爲這是它非常強大的一個非常重要的原因。 C#可以真正使用這個功能。也許叫它「擴展接口」:)

+0

特別激怒我的是缺乏像IAddable這樣的接口,這對於泛型約束來說是天賜之物。 – Promit 2009-04-29 00:22:39

+0

準確! Haskell的類型類可以讓你做各種簡潔的事情。例如,「add3 x = x + 3」是一個將3加到* any *「Num」類型的函數;這意味着,如果稍後有人過來創建自己的「Num」類型,則該功能將完美地與其一起工作。 – kinghajj 2009-04-29 00:27:07

+0

最好。示例代碼。永遠。 – 2009-04-29 01:07:34

回答

0

那麼泛型呢?基本的數字類型都實現了ICopmarable,所以你可以寫一個IComparer實現來傳遞給數組的Sort方法。

或者也許是一種擴展方法。

2

不支持接口,但可以使用擴展方法做類似的事情。你只是不會得到「合同」

0

如果你控制實例的創建,你可以繼承這個類並在新的繼承者類中實現接口。

0

其他人已經回答了主要問題,但是關於您的特定基數排序場景,您還可以查看.NET Framework中用於比較,散列等的模式類型:允許基數排序方法的用戶傳入控制排序順序的對象。例如。使用RadixKey屬性創建一個IRadixKeyProvider接口(類似於IHashCodeProvider或IComparer)。

這並不理想,因爲用戶在每次對基本集合進行基數排序時都必須傳入IRadixKeyProvider,而不是在集合類型上一次性定義基數鍵。 (儘管你可以通過爲預定義的類型創建一個重載的排序方法來緩解這個問題,它在內部創建了相關的IRadixKeyProvider,然後轉發給更一般的方法。)當然,它沒有解決更一般的場景(是的,我也想要類型類!)。但至少可以避免複製基數排序代碼。

0

我看不到內在類型的解決方案,但對於其他類型(即由您或其他人創建的類型),您可以將其子類化並實現您選擇的接口。

public interface ISortable 
{ 
    // ... whatever you need to make a class sortable 
} 

public class ExistingType 
{ 
    // whatever 
} 

public class NewType : ExistingType, ISortable 
{ 
    // ... 
} 

除非當然,如果你有權訪問現有的類型...然後只是讓它實現你的接口。

相關問題