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;
    }
}
4

3 回答 3

3

你不应该这样做。通过在抽象类中定义 getter 和 setter 是在说“如果你想从我那里继承,你必须实现它”。然后你问,“我怎样才能让派生类忽略这个规则。”

答案是,如果您遇到每个派生类都需要一个 getter 的情况,请将其放在抽象类中,并让派生类决定是否实现 setter,方法是将其排除在抽象类之外。

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

于 2009-06-08T22:38:26.867 回答
0

abstract你不应该使用override

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

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

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

于 2009-06-08T22:42:14.800 回答
0

看起来您正在搜索 [ReadOnly(true)] 属性 ,这将在属性网格中显示为只读属性。
但是在您的班级中,您可以将其用作通常的属性(具有读写可能性)

于 2009-06-08T23:41:44.867 回答