Сгенерируйте события базового класса в производных классах C#

Вы можете установить этот пакет flutter_maps , чтобы использовать OpenStreetMaps

Вот пример

new FlutterMap(
        options: new MapOptions(
            center: new LatLng(51.5, -0.09),
            zoom: 5.0,
            maxZoom: 5.0,
            minZoom: 3.0),
        layers: [
          new TileLayerOptions(
              urlTemplate:
                  "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
              subdomains: ['a', 'b', 'c']),
        ],
      ),

8
задан Game_Overture 23 April 2009 в 01:55
поделиться

4 ответа

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

Использовать base.OnMove () вместо.

12
ответ дан 5 December 2019 в 08:26
поделиться

Из спецификации языка C #, раздел 10.7 (выделение добавлено):

Внутри текста программы класса или структуры который содержит объявление события, некоторые события могут использоваться как поля . Чтобы использовать его таким образом, событие не должно быть абстрактным или внешним, и не должно явно включать объявления доступа к событиям. Такое событие может использоваться в любом контексте, который разрешает поле. Поле содержит делегат (§15), который ссылается на список обработчиков событий, которые были добавлены к событию. Если обработчики событий не были добавлены, поле содержит нуль.

Таким образом, причина, по которой вы не можете рассматривать событие Move как поле, состоит в том, что оно определено в другом типе (в данном случае, в вашем суперклассе). Я согласен с предположением @ womp о том, что дизайнеры сделали этот выбор, чтобы предотвратить непреднамеренное вмешательство в это событие. Кажется очевидным, что делать несвязанные типы (типы, не производные от типа, объявляющего событие), возможно, но это может быть нежелательно даже для производных типов. Вероятно, им пришлось бы включить синтаксис, чтобы сделать объявление события частным или защищенным в отношении использования стиля поля,

4
ответ дан 5 December 2019 в 08:26
поделиться

Разница заключается в объеме. Внутри вашего класса вы можете контролировать, как обрабатываются ваши делегаты событий, однако ваш класс не может контролировать, что делает базовый класс. Возможно, он делал какие-то безумные закулисные вещи с событием и его обработчиками. Если бы вы просто «переназначили» событие Move, вы бы стерли список делегатов многоадресной рассылки для этого события.

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

3
ответ дан 5 December 2019 в 08:26
поделиться

Вам нужен только код, который вы разместили в классе, где определено само событие. Все производные классы должны просто вызывать OnShapeChanged () или OnMove () напрямую, без копирования и т. Д., Поэтому вам вообще не следует писать этот код в ваших классах (так как событие Move определено в базе).

Если вам нужно выполнить какую-то обработку в производном классе (может, вам нужно поиграться с вашим классом коллекции?), Вы переопределяете виртуальный вызов OnXXX и выполняете какие-либо действия перед вызовом base.OnXXX (). В статье MSDN класс Circle соответствует вашему классу DockedToolWindow. Тот же шаблон должен быть доступен для ваших производных классов.

1
ответ дан 5 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

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