переопределение абстрактного метода в производном классе, как сделать private

StackOverflow https://stackoverflow.com/questions/1816399

Вопрос

Привет, у меня есть класс "A" с абстрактным методом as

protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);

Я хочу переопределить этот метод в производном классе "B" со следующими условиями

  • Это должно быть закрыто для класса B.

компилятор не позволяет мне объявлять этот метод как закрытый в производном классе "B" каков правильный синтаксис?

Это было полезно?

Решение

Ты не можешь.Это нарушило бы уровень доступности, объявленный в классе A.Помимо всего прочего, это помешало бы ему быть вызываемым классом A!Что бы вы ожидали, если бы код в классе A попытался вызвать абстрактный метод, который вы каким-то образом переопределили частной реализацией?

Вы можете сделать основную реализацию закрытой, а затем создать защищенный метод, который просто вызывает закрытый, если вы действительно этого хотите.

Почему вы хотите сделать метод закрытым в первую очередь, когда он предназначен для вызова из A?

Редактировать:Хорошо, теперь, когда вы объяснили в своем комментарии, что вы хотите сделать, вы не можете этого сделать.Самое близкое, что вы можете сделать, это передать делегат конструктору A - этот делегат может ссылаться на частный метод.К сожалению, вы не можете использовать "this" при передаче аргументов в цепочках конструкторов, поэтому вы вынуждены делать что-то ужасное, например, писать статический метод, который эффективно принимает "this" в качестве своего первого параметра...за исключением того, что ему также придется привести его к нужному типу, так как родительский элемент не может объявить, каким типом он должен быть.Затем родительский элемент вызовет делегат вместо защищенного метода.

Обратите внимание, что это также предотвратило бы дальнейшее "переопределение" дальнейших производных классов, что может быть или не быть желательным.

Это невероятно извилисто, и я бы постарался избегать этого везде, где это возможно.Если вы действительно беспокоитесь о том, что могут делать производные классы, я бы попытался вместо этого запечатать класс и заставить людей использовать композицию вместо наследования.Язык на самом деле не помогает вам делать здесь то, что вы хотите.

Другие советы

Как общее правило OOPS, нельзя уменьшать видимость элемента при переопределении.Таким образом, переход от защищенного к частному недопустим.

Вы не можете изменить уровень доступа к виртуальным методам в C #.Вы можете повторно объявить его, используя new ключевое слово, но это повторное объявление, которое скрывает предыдущий метод, поэтому оно не будет работать так, как вы ожидаете, если вы имеете дело с объектами, которые отличаются объявленным и фактическим типом, или если вы регулярно приводите объекты к типу базового класса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top