lúc đầu nó nghĩ rằng điều này được thực hiện với một giao diện nhưng sau đó tôi thấy rằng nó nên được thực hiện bằng cách sử dụng một lớp trừu tượng.
tôi đã giải quyết nó theo cách này:
chỉnh sửa: thời gian gần đây tôi chỉ sử dụng này:
public static abstract class callback1<T>{
public abstract void run(T value);
}
public static abstract class callback2<T,J>{
public abstract void run(T value,J value2);
}
public static abstract class callback3<T,J,Z>{
public abstract void run(T value,J value2,Z value3);
}
public static abstract class callbackret1<R,T>{
public abstract R run(T value);
}
public static abstract class callbackret2<R,T,J>{
public abstract R run(T value,J value2);
}
public static abstract class callbackret3<R,T,J,Z>{
public abstract R run(T value,J value2,Z value3);
}
CallBack.java
public abstract class CallBack<TRet,TArg> {
public abstract TRet call(TArg val);
}
xác định phương pháp: Phương pháp
class Sample2
{
CallBack<Void,String> cb;
void callcb(CallBack<Void,String> CB)
{
cb=CB; //save the callback
cb.call("yes!"); // call the callback
}
}
sử dụng:
sample2.callcb(new CallBack<Void,String>(){
@Override
public Void call(String val) {
// TODO Auto-generated method stub
return null;
}
});
hai đối số mẫu: CallBack2.java
public abstract class CallBack2<TRet,TArg1,TArg2> {
public abstract TRet call(TArg1 val1,TArg2 val2);
}
lưu ý rằng khi bạn sử dụng kiểu trả về Void bạn phải sử dụng trả về null; do đó, đây là một biến thể để khắc phục điều đó vì thường gọi lại không trả về bất kỳ giá trị nào.
khoảng trống như kiểu trả về: SimpleCallBack.java
public abstract class SimpleCallBack<TArg> {
public abstract void call(TArg val);
}
khoảng trống như kiểu trả về 2 args: SimpleCallBack2.java
public abstract class SimpleCallBack<TArg1,TArg2> {
public abstract void call(TArg1 val1,TArg2 val2);
}
giao diện không phải là hữu ích cho việc này.
giao diện cho phép nhiều loại khớp với cùng loại. bằng cách có một bộ chức năng được xác định trước.
lớp trừu tượng cho phép các hàm trống bên trong chúng được hoàn thành sau này. mở rộng hoặc khởi tạo.
Không, nhưng hãy xem những thứ như http://www.programmingforums.org/thread27905.html. –