переопределение абстрактного метода в производном классе, как сделать приватным - PullRequest
7 голосов
/ 29 ноября 2009

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

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

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

  • Должно быть приватно для класса B.

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

Ответы [ 3 ]

8 голосов
/ 29 ноября 2009

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

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

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

РЕДАКТИРОВАТЬ: Хорошо, теперь вы объяснили в своем комментарии, что вы хотите сделать, вы не можете сделать это. Самое близкое, что вы можете получить, - это передать делегат конструктору А. Этот делегат может ссылаться на закрытый метод. К сожалению, вы не можете использовать «this» при передаче аргументов в цепочках конструктора, поэтому вы вынуждены делать что-то ужасное, например, писать static метод, который эффективно принимает «this» в качестве первого параметра ... за исключением того, что ему также придется приводить его к нужному типу, так как родитель не может объявить, каким типом он должен быть. Затем родитель будет вызывать делегат вместо защищенного метода.

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

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

2 голосов
/ 29 ноября 2009

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

0 голосов
/ 29 ноября 2009

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

...