2009-06-08 63 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

看起来像你寻找 [只读(真)]属性 这将显示到属性网格你的财产,为只读。
但在你的课堂上,你可以像往常一样使用它的属性(具有读取和写入的可能性)