Как предотвратить скрытие или переопределение публичной собственности - PullRequest
3 голосов
/ 24 августа 2010

У меня есть абстрактный базовый класс, в котором есть свойство, которое я хотел бы предотвратить как скрытием, так и новым, и переопределением.

public abstract class DomainObject
{
    public bool IsDeleted { get; set; }
}

public class BankAccount : DomainObject
{
    public bool IsDeleted { get; set; }
}

Проблема заключается в следующем: мне нужен BankAccount для наследования отбазовый класс DomainObject, поэтому я не могу пометить его как запечатанный, но я хочу предотвратить ситуацию, переопределение или новую ситуацию IsDeleted во время компиляции.

Ответы [ 4 ]

11 голосов
/ 24 августа 2010

В этом случае IsDeleted не является виртуальным, поэтому переопределение невозможно. В общем случае вы можете предотвратить случай переопределения, не устанавливая свойство виртуальным в первую очередь, или предотвращая дальнейшие переопределения, указав модификатор sealed в свойстве

public sealed override IsDeleted { get; set; }

Однако вы не можете предотвратить скрытие через new. Нет никакого способа предотвратить использование подтипа new в существующем свойстве, кроме как вообще запретить подтипы

2 голосов
/ 24 августа 2010

Зачем вам нужна такая функция?Невозможно запретить ни свойствам, ни методам скрываться в подклассах.

1 голос
/ 07 ноября 2012

У меня была такая же необходимость по той же причине, о которой вы упоминали в комментариях: предотвращение проблем, вызванных сгенерированным кодом.Мое решение состояло в том, чтобы сделать это конкретное предупреждение ошибкой, что можно сделать, добавив «0108» в список «Свойства проекта» => «Построить» => «Обработать предупреждения как ошибки» => «Определенные предупреждения».

Мне было бы любопытно узнать, почему это считается только предупреждением, а не ошибкой.Конечно, это некая «хрупкая базовая классовая» ситуация, которую я не рассматривал ...

0 голосов
/ 02 июля 2013

Как насчет добавления предка в DomainObject, где IsDeleted будет помечен как виртуальный, а затем в DomainObject вы сможете пометить его как запечатанное переопределение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...