Частичное переопределение виртуального авто-свойства в дочернем классе - PullRequest
21 голосов
/ 07 октября 2010

Время для теоретического вопроса, с которым я только что столкнулся.

Следующий код действителен и компилируется:

public class Parent
{
    public virtual object TestProperty { get; set; }
}

public class Child : Parent
{
    private string _testValue = "Hello World!";

    public override object TestProperty
    {
        get { return _testValue; }
    }
}

public class Consumer
{
    Parent p = new Child();

    public Consumer(){ p.TestProperty = 3; }
}

Мой вопрос:

Почемупозволяет ли C # частично переопределить свойство auto TestProperty в дочернем элементе, если оно приводит к частично непредсказуемому поведению? Есть ли практическое применение?

Мне разрешено устанавливать значение TestProperty с помощьюсеттер родителя (я проверил генерируемый IL, и сеттер все еще устанавливает объект поддержки в родительском классе), хотя значение не доступно для публики.

Ответы [ 2 ]

12 голосов
/ 07 октября 2010

Это поведение согласуется с неавтоматизированными свойствами в C #.Всегда было возможно переопределить только метод get или set для виртуального свойства.Следовательно, невозможность использования автоматически внедренного свойства создаст ненужную несогласованность.

Например, следующее допустимо

class A
{
    public virtual int P1
    {
        get { return 42; }
        set { }
    }
}

class B : A
{
    public override int P1
    {
        get { return 18; }
    }
}
1 голос
/ 07 октября 2010

Разве это не имеет смысла для сеттера?Если вы частично переопределяете только установщик, это может быть полезно, чтобы вы могли реагировать на это событие, в дополнение к вызову base.TestProperty = value, не беспокоясь и о переопределении стандартного метода получения.

...