По моему мнению, это не должно быть разрешено в C ++:
class A {
public:
virtual string foo(){return "A::foo";}
};
class B : public A {
public:
virtual string foo(){return "B::foo";}
};
int main () {
B* b = new B();
// In my opinion the following should not be allowed
cout << b->A::foo() << endl; // Will print "A::foo"
}
Это может показаться правильным, но это означает, что вы не можете переопределить метод, не позволяя пользователям подкласса вызывать оригинальный метод вместо новый.
Просто подумайте о подклассе коллекции, где вы хотите увеличить количество элементов при добавлении элемента в саму коллекцию.
Логичным решением было бы переопределить метод add (), чтобы увеличить счетчик перед добавлением элемента, но пользователь новой коллекции может добавить элемент к нему, используя старый метод, так что вы обходите приращение и получаете элементы. -счетчик не согласен с фактическим количеством элементов коллекции.
Это невозможно в Java.
Диалоговое окно предоставляет два свойства , которые вы, возможно, захотите проверить: isLoaded
и open
. Покопавшись в коде, вы найдете следующие описания:
Итак, вы можете просто:
var dialog = dijit.byId("blah");
if( dialog.open ) {
dialog.destroy();
}
Вы хотите спрятать его или уничтожить?
Если вы просто хотите показать / скрыть его, вы можете сделать следующее:
var dialog = dijit.byId('blah');
if (dialog) {
if (dialog.open) {
dialog.hide();
}
else {
dialog.show();
}
}
Если вы хотите уничтожить его, чтобы освободить память:
var dialog = dijit.byId('blah');
dialog.destory();
Я думаю, что destroy
рекурсивен, поскольку он вызывает свой родительский метод destroy
, а одним из его родителей является dijit.layout.ContentPane
.