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

Вы можете использовать как явное, так и неявное управление скоростью в Simulink.

  1. Время выборки Чтобы установить основное время выборки, перейдите в: Параметр конфигурации> Решатель> Размер с фиксированным шагом. Вы также можете использовать API Simulink:

get_param (bdroot, 'FixedStep')

set_param (bdroot, 'FixedStep', '0.005')% 200 Гц

  1. Цвета Чтобы активировать цвета времени выборки, перейдите по ссылке: Дисплей> Время выборки> Все. Легенда о времени выборки поможет вам понять, как работает неявный контроль скорости.

  2. Параметр времени выборки Вы можете управлять параметрами задания и времени выборки через: Параметры конфигурации> Солвер> Задачи и параметры времени выборки.

В начале вы можете активировать автоматическую обработку изменения скорости передачи данных. Затем вы проанализируете, какие цвета имеют ваши элементы модели, и поместите блоки Rate-Transition на сигнальные линии данных между элементами модели с разными частотами дискретизации.

Теперь контроль скорости неявный. Если вы используете вызовы функций для явного вызова ваших подсистем с требуемой скоростью, используя предопределенный планировщик, тогда контроль скорости будет явным.

Вы можете открыть сборку в примерах Simulink, чтобы увидеть, как она работает:

sf_ladder_logic_scheduler

sf_loop_scheduler

5
задан Graviton 13 January 2009 в 07:28
поделиться

6 ответов

Есть решение, но оно уродливое: используйте отражение, чтобы получить базовый- class, а затем испустить IL, необходимый для его вызова. Посмотрите это сообщение в блоге , в котором показано, как это сделать. Я успешно использовал этот подход для вызова реализации метода базовым классом, когда все, что у меня есть, - это ссылка на производный класс, который переопределяет этот метод.

3
ответ дан 14 December 2019 в 13:49
поделиться

Назвать MyBase. DoMe () от внешнего класса, Вам были бы нужны или экземпляр MyBase или в полученный экземпляр, который не переопределяет DoMe (). Метод, объявленный как виртуальное, назовут на фактическом типе выполнения объекта, не типе объекта, который является, почему кастинг к MyBase не изменяет то, какой метод называют. Если бы однако метод не был объявлен в MyBase как виртуальный, и MyDerived все еще реализовал DoMe (), то он "скрыл" бы реализацию MyBase. Поэтому, если бы ссылкой был MyDerived, то это назвало бы MyDerived. DoMe (), но в этом кастинге случая к MyBase myBase = (MyBase)myDerived и затем вызов myBase. DoMe () назвал бы MyBase. DoMe ().

0
ответ дан 14 December 2019 в 13:49
поделиться

Вы не можете назвать версию базового класса.

Если метод не работает над производным классом, то довольно маловероятно, что базовая версия метода будет работать при вызове на экземпляре производного класса. Это просто напрашивается на неприятности. Класс не был разработан для прокладывания себе путь, и что Вы пытаетесь сделать, вероятно, просто заставит другие части класса вести себя непредсказуемо.

Почему необходимо назвать этот метод на объекте, когда объект говорит Вам напрямую, что не будет работать?

Мне кажется, что эти классы имеют некоторые недостатки дизайна, и если Нельзя изменить классы, возможно, Вам разрешают измениться на более хорошо разработанную библиотеку вместо этого.

3
ответ дан 14 December 2019 в 13:49
поделиться

Производный класс не должен обеспечивать реализацию метода. Удалите его, и реализацию в базовом классе назовут по умолчанию.

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

0
ответ дан 14 December 2019 в 13:49
поделиться
public class MyDerived:MyBase{    
    public override void DoMe()    
    {        
        base.DoMe();
    }
}

Править:

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

MyBase mb = new MyBase();
mb.DoMe();
0
ответ дан 14 December 2019 в 13:49
поделиться

Учитывая Ваши ограничения, существует другая возможность:

Загрузите.Net Reflector. Декомпилируйтесь существующий код затем вносят любые изменения, необходимо поддерживать ситуацию.

Конечно, рассмотрите законность этого перед продолжением.

0
ответ дан 14 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

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