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

            FirefoxProfile profile = new FirefoxProfile();
            // profile.SetPreference("browser.helperApps.neverAsk.saveToDisk", " text/plain, application/octet-stream doc xls pdf txt");
            profile.SetPreference("browser.download.manager.alertOnEXEOpen", false);
            profile.SetPreference("browser.helperApps.neverAsk.saveToDisk", "application/csv, text/csv, text/plain,application/octet-stream doc xls pdf txt");
            profile.SetPreference("browser.download.manager.focusWhenStarting", false);
            profile.SetPreference("browser.download.useDownloadDir", true);
            profile.SetPreference("browser.helperApps.alwaysAsk.force", false);
            profile.SetPreference("browser.download.manager.closeWhenDone", true);
            profile.SetPreference("browser.download.manager.showAlertOnComplete", false);
            profile.SetPreference("browser.download.manager.useWindow", false);
            profile.SetPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false);
            profile.SetPreference("pdfjs.disabled", true);
            _driverInstance = new FirefoxDriver(profile); 

Эти настройки работали для меня. Надеюсь, это может вам помочь.

27
задан moooeeeep 5 June 2013 в 07:50
поделиться

12 ответов

Несколько идей:

  1. Делают Вашу функцию частной.
  2. не делают Вашу функцию виртуальной. Это на самом деле не препятствует тому, чтобы функция была затенена по другому определению все же.

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

Удачи!

13
ответ дан OJ. 28 November 2019 в 04:50
поделиться

Походит на то, что Вы ищете, эквивалент языка Java финал ключевое слово, которое препятствует тому, чтобы метод был переопределен подклассом .

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

6
ответ дан Community 28 November 2019 в 04:50
поделиться

(a) я не думаю, делая функцию частной, решение, потому что это просто скроет функцию базового класса от производного класса. Производный класс может всегда определять новую функцию с той же подписью. (b) Создание функции, не виртуальной, является также не полным решением, потому что, если производный класс переопределяет ту же функцию, можно всегда вызывать функцию производного класса ко времени компиляции, связывая т.е. obj.someFunction (), где obj является экземпляром производного класса.

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

2
ответ дан 28 November 2019 в 04:50
поделиться

время компиляции, предупреждая о сокрытии невиртуальной наследованной функции X.

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

1
ответ дан csmba 28 November 2019 в 04:50
поделиться

Я предполагаю то, о чем компилятор предупреждает Вас, скрывается!! Это на самом деле переопределяет?

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

Это интересно. Попытайтесь делать маленькую автономную тестовую программу для своего компилятора.

1
ответ дан RuntimeException 28 November 2019 в 04:50
поделиться

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

т.е.:

Parent* obj = new Child();
0
ответ дан Ryan Fox 28 November 2019 в 04:50
поделиться

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

Так C++ по умолчанию делает то, что Вы хотите.

0
ответ дан Mark Harrison 28 November 2019 в 04:50
поделиться

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

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

0
ответ дан Mark Cidade 28 November 2019 в 04:50
поделиться

В Вашем примере не переопределяется никакая функция. Это вместо этого скрыто (это - своего рода ухудшившийся случай перегрузки). Ошибка находится в коде Дочернего класса. Как csmba предложенный, все, что можно сделать, изменяет параметры компилятора (если возможный); это должно быть прекрасным, пока Вы не пользуетесь сторонней библиотекой, которая скрывает ее собственные функции.

0
ответ дан Luc Hermitte 28 November 2019 в 04:50
поделиться

Методы C++ являются частными и непереопределяемыми по умолчанию.

  • Вы не можете переопределить закрытый метод
  • , который Вы не можете переопределить не - virtual метод

, Вы, возможно, обращаетесь к перегрузке?

-1
ответ дан Frank Krueger 28 November 2019 в 04:50
поделиться

Для пояснения, большинство из вас неправильно поняли его вопрос. Он не спрашивает о «переопределении» метода, он спрашивает, есть ли способ предотвратить «сокрытие» или нет. И простой ответ - «нет ни одного!».

Вот его пример еще раз

Родительский класс определяет функцию:

int foo() { return 1; }

Дочерний класс, наследующий родительский, определяет ту же функцию СНОВА (не переопределяя):

int foo() { return 2; }

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

Это то, о чем он спрашивает.

2
ответ дан 28 November 2019 в 04:50
поделиться

Технически вы можете предотвратить переопределение виртуальных функций. Но вы никогда не сможете изменить или добавить больше. Это не полная помощь. Лучше использовать комментарий перед функцией, как предлагает faq lite.

0
ответ дан 28 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

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