2009-06-08 67 views
3

我有一個抽象類,其抽象屬性設置爲同時具有Get和Set。我知道我總是希望能夠得到此屬性來自派生類,但有些情況下它對集合沒有意義。此屬性在某些類型的派生類中。抽象屬性的可訪問性

我不能忽略派生類中的Set訪問器(請參閱下面的代碼示例)。我可以重寫派生類中的set訪問器,以便與用戶傳遞的值無關。但是有沒有另外一種方法可以使特定派生類中的屬性只讀?最終,我在屬性網格中顯示這些屬性,並且我不希望用戶將值輸入到無法執行任何操作的字段中。也許我只是將該屬性歸類爲只讀在特定的派生類中?

另外,我真的不太會混淆任何類型描述​​符的東西,以獲得屬性在屬性網格中正確顯示,例如重寫ICustomTypeDescriptor。

public abstract class MyClass 
{ 
    public abstract string MyProperty 
    { 
     get; 
     set; 
    } 
} 

public abstract class MyDerivedClass 
{ 
    public override string MyProperty 
    { 
     //VS complains that the Set accessor is missing 
     get; 
    } 
} 
+0

只是想知道...如果你爲它定義一個get/set方法,屬性是否真的抽象?或者這些是抽象的get/set方法? – 2009-06-08 22:32:26

+0

奇數。我只是複製了你的類,爲第二個類繼承了繼承屬性,並且可以毫無問題地構建。 – 2009-06-08 22:33:35

回答

3

你不應該這樣做。通過在抽象類中定義getter和setter,你所說的是「如果你想從我這裏繼承,你必須實現這個。」然後你問,「我怎麼能讓派生班級忽略這個規則。」

答案是,如果你有一種情況,即每個派生類需要一個getter,把它放在抽象類中,讓派生類決定是否將它們放在抽象類之外來實現一個setter。

或者,您可以創建另外兩個從初始抽象類派生的類,一個實現setter,另一個不派生,然後讓派生類推廣那些有意義的類,但這是過度的我認爲。

0

您應該使用abstractoverride

public abstract class MyClass 
{ 
    public abstract string MyProperty 
    { 
     get; 
     set; 
    } 
} 

public abstract class MyDerivedClass 
{ 
    public abstract string MyProperty 
    { 
     get; 
    } 
} 

但像@JP寫道,你不應該這樣做。

0

看起來像你尋找 [只讀(真)]屬性 這將顯示到屬性網格你的財產,爲只讀。
但在你的課堂上,你可以像往常一樣使用它的屬性(具有讀取和寫入的可能性)