2011-05-03 44 views
1

我在課堂上有一個公共方法。我想使這個私人並使用一個屬性來揭露這個方法。問題是我的方法接受一個整數參數並返回一個布爾值。根據我的經驗,財產必須接受並返回相同的類型。封裝此方法並使用屬性公開它的最佳做法是什麼?創建一個屬性,它接受與返回不同的類型

回答

9

你不應該用這種方式使用屬性。屬性用於將get_set_調用包裝爲適當的後臺字段並將它們公開爲單個成員。內部生成的set_方法爲void,並接受屬性類型的實例作爲其唯一參數。

如果您試圖實現需要一個方法,然後公開一個方法。唯一可能的解決方案是使用object

3

如果傳入的值與返回值不同,那麼它是而不是屬性。如果你沿着這條路線走下去,你會爲任何需要調用你的代碼或者將來維護它的人造成混淆。

我能想到的唯一解決方案和一個差的就是聲明該屬性的類型爲object

封裝此方法並使用屬性公開它的最佳做法是什麼?

它必須是相同的屬性嗎?你能有類似的東西:

private Type2 _valueThatIsStoredAsAResultOfCallMethod; 

private Type2 CallMethod(Type1 value) 
{ 
    // Whatever logic is required here to take a value of Type1 and 
    // get a value of Type2 from it 
    return value.ToType2(); 
} 

public Type1 
{ 
    set 
    { 
     // value is of type Type1 
     _valueThatIsStoredAsAResultOfCallMethod = CallMethod(value); 
    } 
} 

public Type2 
{ 
    get 
    { 
     return _valueThatIsStoredAsAResultOfCallMethod; 
    } 
} 
+0

你是什麼建議?只是揭露這個方法? – rross 2011-05-03 13:56:51

+0

@rross - 我向您建議了一個選項,這可能是我添加它時的兩個屬性,具有不同的類型。這可能是值得解釋**爲什麼**你想隱藏的方法,並通過暴露財產=) – Rob 2011-05-03 14:00:34

0

沒有最好的做法,因爲這是一個不好的做法。

如果你有兩個協變類型作爲你的接受/迴歸,你可以用他們最低的共同祖先來引用它們,但我仍然會保持警惕。

1

嗯,一般來說,通過一個屬性調用一個方法是不好的做法(或者做任何複雜的屬性),因爲它不是該類的用戶預期會發生的事情。預期的行爲正在獲得價值。

我只是公開這個方法。

0

方法用於返回不同類型並接受輸入。

屬性沒有。他們返回一種類型並且不接受任何輸入。將兩者分開的主要事情之一。

0

接受參數並返回值的方法無法很好地轉換爲屬性,無論它使用何種類型。

該方法接受參數,然後返回結果,而一個參數接受一個值或返回一個值,而不是在同一個操作中。如果您必須首先使用該屬性,然後再讀取該值,那將非常直觀。根本不是你通常如何使用一個屬性。

1
public bool MyProp 
{ 
    get; 
    private set; 
} 


public int MyProp_AsInt 
{ 
    set 
    { 
     MyProp = (value > 0) ? true : false; 
    } 
} 

您的函數的主體可以替換上面的'set'。 我只是在那裏放了一些示例代碼。

確保將函數的返回值賦值給MyProp。

全碼

public class MyClass 
{ 

    public bool MyProp 
    { 
     get; 
     private set; 
    } 


    public int MyProp_AsInt 
    { 
     set 
     { 
      MyProp = (value > 0) ? true : false; 
     } 
    } 

} 

public class Program 
{ 

    static void Main(string[] args) 
    { 
     MyClass o = new MyClass(); 
     o.MyProp_AsInt = 1; 
     System.Console.WriteLine("{0}", o.MyProp); 
     o.MyProp_AsInt = 0; 
     System.Console.WriteLine("{0}", o.MyProp); 

     string line = System.Console.ReadLine(); 
    } 
} 
+0

我建議你給你的答案添加一點解釋。僅有代碼的答案(有時)足夠好,但代碼+解釋答案(幾乎總是)更好 – Barranka 2014-08-27 18:49:04

相關問題