Доступность абстрактных свойств - PullRequest
3 голосов
/ 09 июня 2009

У меня есть абстрактный класс с абстрактным свойством, для которого установлены оба параметра: 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 ]

3 голосов
/ 09 июня 2009

Ты не должен этого делать. Вы определяете свой метод получения и установки в абстрактном классе так: «Вы должны реализовать это, если хотите наследовать от меня». Затем вы спрашиваете: «Как я могу заставить производный класс игнорировать это правило?»

Ответ таков: если у вас есть ситуация, когда каждому производному классу нужен метод получения, поместите его в абстрактный класс и позвольте производному классу решить, будут ли они реализовывать метод установки или нет, оставив его вне абстрактного класса.

Или, альтернативно, вы можете создать еще два класса, которые являются производными от исходного абстрактного класса, один, который реализует установщик, а другой - нет, а затем ваш производный класс обобщает один из тех, которые имеют смысл, но это излишне. думаю.

0 голосов
/ 09 июня 2009

похоже, что вы ищете Атрибут [ReadOnly (true)] это покажет сетке свойств вашу собственность, как только для чтения.
но в вашем классе вы можете использовать его как обычное свойство (с возможностью чтения и записи)

0 голосов
/ 09 июня 2009

Вы должны использовать abstract, а не override:

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

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

но, как писал @JP, вы не должны этого делать.

...