2009-12-15 43 views
6

Nếu tôi lấy được một lớp từ một lớp khác và ghi đè lên một hàm, tôi có thể gọi hàm cơ sở bằng cách gọi Base::myFunction() bên trong việc thực hiện myFunc trong lớp dẫn xuất.Lớp bắt nguồn lực để gọi hàm cơ sở

Tuy nhiên, có cách nào để xác định trong lớp Base của mình mà hàm cơ sở được gọi trong bất kỳ trường hợp nào, cũng không có nó được gọi một cách rõ ràng trong hàm bị ghi đè không? (Trước hoặc sau khi các chức năng có nguồn gốc thực hiện)

Hoặc thậm chí tốt hơn, nếu tôi có một hàm ảo trong lớp Base ảo của tôi, và hai chức năng riêng thực hiện before()after(), là nó có thể xác định trong lớp Base rằng trước và sau hàm trong bất kỳ lớp dẫn xuất nào của lớp Base này được gọi là, before()after() sẽ được gọi?

Cảm ơn!

+4

Ngôn ngữ này là gì? –

+2

Có lẽ C++ ('Base :: myFunction' có vẻ là C++) –

+0

Tôi không thể không nghĩ rằng điều này đòi hỏi lập trình hướng khía cạnh, mặc dù đáng buồn là việc triển khai vẫn còn thiếu. –

Trả lời

21

Không, điều này là không thể.
Nhưng bạn có thể mô phỏng nó bằng cách gọi một hàm ảo khác nhau như vậy:

class Base 
{ 
public: 
    void myFunc() 
    { 
    before(); 
    doMyFunc(); 
    after(); 
    } 

    virtual void doMyFunc() = 0; 
}; 
+0

+1, tôi vừa mới đăng đề xuất đó. – Roddy

+8

Nếu bạn thực hiện chức năng ảo được bảo vệ (hoặc thậm chí là riêng tư) thì bạn vô hiệu hóa mã khác gọi trực tiếp phương thức ảo thông qua tham chiếu đến cơ sở (không phải là chúng có tham chiếu đến kiểu dẫn xuất). có sẵn) –

+0

Điều này phục vụ nhu cầu của tôi! cảm ơn bạn :) – Mat

0

Bạn đang cố gắng ngăn chặn một lớp dẫn xuất từ ​​quá tải/ghi đè phương thức trong cơ sở. Bạn có thể khuyến khích nó bằng cách đánh dấu các phương thức là 'không thể ghi đè' (tùy thuộc vào ngôn ngữ), nhưng luôn luôn có một cách xung quanh nó.

Nói cách khác, bạn không thể ép buộc ai đó sử dụng lớp học của mình theo một cách cụ thể, chỉ cho họ biết cách sử dụng nó.

+1

không - tôi muốn phương pháp được ghi đè - nhưng tôi muốn rằng basefunction được gọi trước khi thực hiện trong lớp dẫn xuất – Mat

+0

thú vị tôi có một downvote * 3 * năm sau đó không có bình luận. – hometoast

0

trả lời cho C++, bạn không thể có một chức năng thừa hưởng "vô hình" được gọi theo cách bạn muốn.

Phương thức duy nhất gọi xuống thông qua các lớp kế thừa là các hàm tạo và hàm hủy.

Các vấn đề liên quan