Listener
public class ExampleActivity extends Activity implements OnClickListener {
public void onStart() {
this.getView("mybutton").addOnClickListener(this);
}
public void onClick(View v) {
// Etwas nützliches tun
}
}
Beispiel ist (fast) lauffähiges Android Java
Listener binden die Komponente die die Events generiert sehr eng an die Komponente die sie abhandelt.
Änderungen der Interfacedefinition müssen in allen implementierenden Komponenten nachgezogen werden.
Alle Events des gleichen Typs müssen in der gleichen Funktion abgehandelt werden.
Lösungen sind generell die Listenerinterfaces so minimal und primitiv wie möglich zu halten um die
Änderungswahrscheinlichkeit zu minimieren. Es ist auch möglich die implementierende Komponente in
speziellen Klassen / internen Klassen zu verteilen, dann sind nicht mehr alle Eventquellen in
einer Funktion zu handhaben. Andererseits erhöht sich dadurch der Codeaufwand und Komplexität.
Slots & Signals
#include "ExampleActivity.h"
ExampleActivity::ExampleActivity(QMainWindow *parent) : QMainWindow(parent) {
setupUi(this);
connect(MyButton, &MyButton::clicked, this, &ExampleActivity::onClickMyButton);
}
void ExampleActivity::onClickMyButton() {
// Etwas nützliches tun
}
Über die "connect" methode können dann fast beliebig slots und signals verbunden werden, wobei immer
die folgenden Informationen angegeben werden müssen: das Objekt das das Signal aussendet, das zu
verbindende Signal (hier "clicked"), das Objekt an dessen slot das Signal angeknüpft wird, und der
slot mit dem das Signal verbunden wird (hier "onClickMyButton").
Slots und Signals müssen, wie im Listener Beispiel die selbe Deklaration besitzen, Typenprüfung ist also
möglich.
Nur Änderungen in der Definition des Signals führen in den abhandelnden Komponenten zu Änderungen.