1. 程式人生 > >如果兩個類希望互相呼叫成員變數或成員函式

如果兩個類希望互相呼叫成員變數或成員函式

如果希望在類A中使用類B的成員變數或成員函式。那麼有兩種方法:

1.類A和類B相互引用

典型例子是MVP,在View中建立Presenter,建立時View將自己傳入

class Activity{
    Presenter mPresenter;
    public Activity(){
        mPresenter = new Presenter(this);
    }    
}

class Presenter{
    Activity activity;
    public Presenter(Activity activity){
        this.activity = activity;
    }
}

2.如果兩個類相互包含引用,這兩個類就耦合得太緊了。還可以用繫結得方法。

典型的例子是Activity和Service,在Service中建立內部類操作Service,想辦法讓Activity拿到Service的這個內部類的物件。可以通過回撥函式的方式拿到

class Service(){
	int a;
	public void fun(){}
	// 內部類Binder可以隨意使用外部類的成員變數和成員函式
    class Binder(){
        public int getA(){
            return a;
        }
        public void fun(){
            fun();
        }
    }
    
    public onCreate(CallbackClass callbackClass){
        Binder binder = new Binder();
        callbackClass.callbackFun(binder);
    }
}
class Activity{
	// Activity只要持有了Service的Binder物件,就可以操作Service了!
	public Service.Service binder;
	// 通過Service的回撥函式拿到Service的binder
	class CallbackClass(){
        public callbackFun(Service.Binder binder){
            Activity.this.binder = binder;
        }        
	}
    public void fun(){
        startService(intent, binder)
    }
}