При переопределении метода мой пользовательский код должен находиться перед или после super (base) - PullRequest
2 голосов
/ 25 февраля 2011

При переопределении метода мой пользовательский код должен предшествовать или после супер (базового) вызова родительского класса?

Ответы [ 6 ]

13 голосов
/ 25 февраля 2011

У вас есть 3 варианта:

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

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

2 голосов
/ 25 февраля 2011

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

2 голосов
/ 25 февраля 2011

Это будет зависеть от того, когда вы хотите, чтобы ваш код выполнялся: до или после базового метода.

1 голос
/ 25 февраля 2011

Это зависит от поведения, которое вы хотите. Вам даже не нужно вызывать метод super вообще. Место, которое вы называете, будет зависеть от того, хотите ли вы, чтобы ваш код выполнялся до или после кода базового класса.

0 голосов
/ 25 февраля 2011

Зависимости переменных вашего экземпляра подкласса от параметров вашего суперкласса будут определять, куда направляется ваш код (Java):


private final Baz baz;

public SubClass(Foo foo, Bar bar) {
  Qux qux = QuxFactory.getQuxForFoo(foo);
  super(bar, qux);
  /* getSize() is a method defined on our super class */
  baz = BazFactory.getBazOfSize(getSize());
}
0 голосов
/ 25 февраля 2011

Как и большинство вещей, простой ответ: это зависит.

Указание super или base позволяет «расширять» метод, добавляя функциональность к тому, что уже существует в базовой реализации. Этот код может потребоваться выполнить до, после или с обеих сторон вызова базовой функциональности. Все сводится к тому, что ваша переопределенная реализация должна делать сверх базовой реализации.

В некоторых местах, по крайней мере, в C #, вы не можете выбирать. Например, конструкторы производных классов в C # должны определить базовый конструктор в своем объявлении (по умолчанию это конструктор без параметров, если таковой существует). Код базового класса ВСЕГДА выполняется перед производным классом, и вы не можете просто вызвать base(x,y) из конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...