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

Не делайте этого. Причина позади этого следующие: по своей природе шаблонного метапрограммирования, если некоторая часть Вашей логики сделана во время компиляции, каждая логика, от которой это зависит, должна быть сделана во время компиляции также. Как только Вы запускаете его, сделайте одну часть своей логики во время компиляции, нет никакого возврата. Снежок продолжит прокручиваться и нет никакого способа остановить его.

, Например, Вы не можете выполнить итерации на элементах повышения:: tuple<>, потому что можно только получить доступ к ним во время компиляции. Необходимо использовать шаблонное метапрограммирование для достижения того, что было бы легким и простым C++, и это всегда происходит, когда пользователи C++ не достаточно осторожны для не перемещения слишком многих вещей во время компиляции. Иногда трудно видеть, когда определенное использование логики времени компиляции стало бы проблематичным, и иногда программисты стремятся попытаться протестировать то, что они считали в Alexandrescu. В любом случае это - очень плохая идея, по-моему.

7
задан Donnie 29 November 2009 в 18:57
поделиться

3 ответа

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

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

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

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

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

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

8
ответ дан 7 December 2019 в 01:22
поделиться

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

2
ответ дан 7 December 2019 в 01:22
поделиться

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

0
ответ дан 7 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: