Mình có 1 yêu cầu thế này:
Có một đối tượng A sẽ tự đẩy một số dữ liệu ra một hàm nằm bên ngoài nó và chạy hàm đó để xử lý.
Tuy nhiên nó không thể biết hàm đó là hàm nào, tên hàm là gì, nằm trong đối tượng nào hoặc nằm ở đâu.
Mình sẽ ví dụ với ngôn ngữ rất gần gũi với C++ là C# và C.
C# có delegate:
public delegate Callback(int data); // kiểu delegate
class A{
private data = 0;
public Callback Called; // chỗ này khai báo delegate tên là Called;
public void Call(){
if(Called != null) Call(a);
}
}
void CustomMethod(int data){
}
void Main(){
A a = new A(); // khai báo một đối tượng từ class A.
a.Called = CustomMethod; // Sẽ gán delegate trỏ đến một method nằm ngoài đối tượng a.
a.Call(); // Gọi a.Call thì dữ liệu data trong đối tượng a sẽ được đẩy qua CustomMethod và hàm CustomMethod sẽ chạy để xử lý.
}
Ở trong C, ta có function pointer.
typedef void(*Callback)(int data); // khai báo 1 kiểu function pointer
Callback Called; // Khai báo một function pointer
void CustomMethod(int data){
}
int main(){
Called = &CustomMethod; // chúng ta sẽ cho Called trỏ đến CustomMethod;
Called(0); // và ta sẽ đẩy data vào CustomMethod thông qua con trỏ hàm Called. Và CustomMethod cũng sẽ chạy.
}
Đó, và bây giờ trong C++ chúng ta sẽ làm thế nào khi con trỏ hàm nằm trong A:
class A{
public:
Callback Called;
void Call(){
// sẽ làm gì ở đây ?
}
}
Và CustomMethod nằm bên ngoài A, ví dụ trong class B:
class B{
public:
void CustomMethod(int data){
}
}
int main(){
A *a = new A();
B *b = new B();
C *c = new C();
// chúng ta sẽ làm gì tiếp theo ở đây để khi gọi a.Call(data) thì B->CustomMethod(data) sẽ chạy.
// hoặc là c->OrtherMothod(data) sẽ chạy.
// chú ý là a hoàn toàn không biết về b và b->CustomMethod hoặc c/ c->OrtherMothod.
// tất cả quá trình gán nằm ngoài sự kiểm soát của các đối tượng chứa function pointer và method.
}
Kính mời các cao nhân và các bạn.