模拟Listener对button的监听过程

来源:互联网 发布:2016淘宝客还能赚钱吗 编辑:程序博客网 时间:2024/05/29 07:20

今天突然冒出一种想法,看看自己到底理解不理解平时对各种按钮实现监听的过程,就用c++简单实现了一下!

首先是写一个抽象的Listener类,java中有接口,C++中就只能使用抽象类了。

Listener类的.h文件,只需要看.h即可,因为在.cpp中没有需要实现的方法。

#ifndef LISTENER_H#define LISTENER_H#include "Button.h"class Button; //需要使用button类 因为在点击的时候会获取Button对象              // 因为Button类中也要使用Listener类,如果仅仅互相包含头文件会报错class Listener{    public:        Listener();        virtual ~Listener();        virtual void onClicked(Button button)=0; //onClicked事件,需要在派生类中重写};#endif // LISTENER_H

Button类的.h文件

#ifndef BUTTON_H#define BUTTON_H#include "Listener.h"class Listener;class Button  //这个例子就是模仿,所以Button类没有继承类似View的基类{public:    Button();    ~Button();    int getId();//获取Button的ID    void setId(int id);//设置Button的ID    void setOnClickListener(Listener *p);//为Button设置监听器    void onPress();//模拟现实中按下Button按钮的行为private:    int id;//ID    Listener *pListener;//监听器};#endif // BUTTON_H
Button类的.cpp文件

#include "Button.h"Button::Button(){}int Button::getId(){    return id;}void Button::setId(int id){    this->id=id;}void Button::setOnClickListener(Listener *listener){    this->pListener=listener;}void Button::onPress(){    pListener->onClicked(*this);}Button::~Button(){}
自己编写了一个main函数测试了一下,跟预期的想法差不多

#include <iostream>#include <string>#include "Button.h"#include "Listener.h"using namespace std;class myListener : public Listener{    public :        virtual void onClicked(Button b)        {              cout<<"Button "<<b.getId()<<" clicked"<<endl;        }};int main(){    Button btn1,btn2;    myListener listener;    btn1.setId(1);    btn2.setId(2);    btn1.setOnClickListener(&listener);    btn2.setOnClickListener(&listener);    btn1.onPress();    btn2.onPress();    return 0;}
程序输出:

Button 1 clicked
Button 2 clicked

总结:这个如果想清楚了,就可以更好的理解监听者模式,也可以对c++里的virtual动态多态有更好的理解,virtual函数如果在函数后面写上=0将会变成纯虚函数~

0 0
原创粉丝点击