2012-03-28 27 views
1

我有一個簡單的接口,被定義爲這樣:界面是否可以要求屬性,但不指定所需的類型?

interface iFace 
{ 
    int Value { get; } 
} 

在這種情況下,實施IFACE必須具有int類型的命名Value屬性的任何類。這個接口的用法將與數據綁定一起使用,我不在乎屬性是什麼類型。我有什麼選擇嗎?我想避免這種情況的解決方案:

interface iFace<T> 
{ 
    T Value { get; } 
} 

,我想指的是接口沒有指定類型

編輯:

我希望能夠能夠應用與NumericUpDown控件和Trackbar控件相同的界面。一個值屬性是十進制類型,另一個是int類型。

使屬性爲類型對象在這種情況下不起作用。

+1

這就是* dynamic *關鍵字的設計目的。 – 2012-03-28 13:05:09

+0

我對.net 3.5及更新版本比較陌生,我不得不考慮動態。 – greggorob64 2012-03-28 13:07:45

+0

@HansPassant它值得一提的是,一個*動態*屬性實際上將被作爲一個*對象*鍵入,因此當接口在另一種語言中使用時會出現這種情況 - 大概在C#項目中作爲裝配參考。我不知道如果跨項目使用VS解決方案中的項目引用將會發生什麼情況;我好奇。如果我記得這麼做,我會在上班時檢查一下。 – phoog 2012-03-28 13:13:26

回答

3

試試這個:

interface MyInterface 
{ 
    Object MyProperty 
    { 
     get; 
     set; 
    } 
} 

class MyClass : MyInterface 
{ 
    Object MyInterface.MyProperty 
    { 
     get 
     { 
      return this.MyProperty; 
     } 
     set 
     { 
      if (value is MyType) 
       this.MyProperty = (MyType)value; 
     } 
    } 

    public MyType MyProperty 
    { 
     get; 
     set; 
    } 
} 
+0

我認爲這將是最好的答案。我將這個接口應用於15個控件,我試圖避免爲它們添加一個明確的接口。 – greggorob64 2012-03-28 13:25:16

7

如果您不在乎是否嚴格鍵入,請將屬性類型更改爲對象。

+1

這讓我的一天 – 2012-03-28 13:06:37

+0

我編輯我的問題來回應這個 – greggorob64 2012-03-28 13:09:18

1

在回答您的編輯:你來了針對.NET沒有INumeric接口衆所周知的問題。它存在於我見過的源代碼中,但它已被註釋掉,這意味着微軟已經認真對待它並且遇到了一些重大問題。

Danny Varod的解決方案是一個很好的解決方案;您還可以通過創建通用接口的非通用版本來擴展它。另一種解決方案是向界面添加代表您現在使用數學運算符的數值運算的方法,例如Increment()

,我會打電話的界面IHasValue這裏(部分原因是因爲它是有點喜劇):

interface IHasValue 
{ 
    object Value { get; set; } 
    void Increment(); 
    void Decrement(); 
} 

interface IHasValue<TValue> : IHasValue { new TValue Value { get; set; } } 

abstract class UpDownValueControl<T> : IHasValue<T> 
{ 
    public T Value { get; set; } 
    object IHasValue.Value 
    { 
     get { return this.Value; } 
     set { this.Value = (T)value; } 
    } 
    public abstract void Increment(); 
    public abstract void Decrement(); 
} 
class NumericUpDownControl : UpDownValueControl<decimal> 
{ 
    public override void Increment() { Value++; } 
    public override void Decrement() { Value--; } 
    //rest of the implementation 
} 
class TrackbarControl : UpDownValueControl<int> 
{ 
    public override void Increment() { Value++; } 
    public override void Decrement() { Value--; } 
    //rest of the implementation 
} 

這是令人沮喪的是,基類不能照顧像遞增和遞減的方法重複的代碼,但至少這種方法允許基類除之外的所有其他處理重複的數學運算符代碼。

最後,我懷疑這個解決方案的複雜性增加了成本而不是收益;我想我會更喜歡Danny Varod的解決方案。

相關問題