抽象属性的可访问性

时间:2009-06-08 22:19:20

标签: c# properties abstract

我有一个抽象类,其抽象属性设置为同时包含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;
    }
}

3 个答案:

答案 0 :(得分:3)

你不应该这样做。你在抽象类中定义你的getter和setter的意思是“你必须实现这个,如果你想继承我的话。”然后你问,“我怎样才能使派生类忽略这个规则。”

答案是,如果你的情况是每个派生类都需要一个getter,那就把它放在抽象类中,让派生类决定是否通过将它从抽象类中删除来实现setter。 / p>

或者,您可以创建另外两个派生自初始抽象类的类,一个实现setter的类,一个不实现setter的类,然后让派生类概括其中一个有意义的类,但这是过度的我认为

答案 1 :(得分:0)

您应该使用abstract而不是override

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

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

但是像@JP写的那样,你不应该这样做。

答案 2 :(得分:0)

看起来你在寻找 [ReadOnly(true)]属性 这将显示属性网格您的财产,只读 但是在你的课堂上你可以像往常一样使用它(具有读写可能性)