2010-04-07 36 views
5

Tôi đã không tìm ra một tiêu đề tốt hơn cho câu hỏi. Để tôi giải thích rõ hơn bây giờ:Làm cách nào để ghi đè lên các phương thức đối tượng C++ lồng nhau?

Dự án tôi đang làm sẽ kết nối với máy chủ từ xa, mã hóa phiên và gửi/nhận gói dữ liệu. Tôi muốn làm cho nó đủ kiểu mô-đun, vì vậy tôi nghĩ sẽ rất tuyệt khi sử dụng 3 lớp riêng biệt. Đây sẽ là:

1) Lớp trình bao bọc socket với một số phương thức ảo như OnReceivedData() và OnConnected().

2) Lớp kế thừa của trình bao bọc socket, triển khai mã hóa dữ liệu trước khi được gửi và giải mã dữ liệu khi đến.

3) Đối tượng chính, sẽ ghi đè lên bất kỳ lớp nào ở trên tùy theo nhu cầu mã hóa hay không, vì vậy nó có thể nhận thông báo sự kiện OnReceivedData() và OnConnected() cũng như hành động dựa trên nó.

Vì vậy, vấn đề là làm cách nào để chương trình của tôi biết trước tiên phải gọi sự kiện trên đối tượng mã hóa và sau đó gọi cùng một sự kiện trên đối tượng chính? Bởi vì tôi đoán nếu tôi ghi đè lên trình bao socket bằng mã hóa và sau đó ghi đè mã hóa với đối tượng chính, nó có thể sẽ chỉ gọi phương thức đối tượng chính (nó sẽ gọi trực tiếp OnReceivedData() trên đối tượng chính, không đi qua giải mã đối tượng đầu tiên, phải không?).

Đây có phải là đa thừa kế không?

BTW nếu bạn cho rằng đó là thiết kế dự án tồi, tôi sẽ đánh giá cao bất kỳ cách tiếp cận nào tốt hơn. Cảm ơn bạn đã dành thời gian đọc nội dung này.

+0

Đề xuất của tôi, hãy thử sử dụng các mẫu thiết kế, chẳng hạn như mẫu 'Builder' hoặc' Factory'. –

Trả lời

2

Nó không được gọi là đa thừa kế (đây là khi một lớp kế thừa từ nhiều lớp siêu). Nó được gọi là phương pháp ghi đè. Trong 'OnReceivedData' chính của bạn, bạn có thể gọi phương thức 'siêu' một cách rõ ràng bằng cách đủ điều kiện tên của nó, EncryptedBaseClass::OnReceivedData().

Điều này có thể trở nên lộn xộn. Những gì tôi muốn giới thiệu là bạn đảo ngược quyền sở hữu và để cho lớp mã hóa giữ tham chiếu đến lớp socket, phù hợp với decorator pattern (Có trình trang trí mã hóa). Điều này sẽ giải quyết vấn đề ghi đè của bạn trong khi vẫn cung cấp cho bạn chức năng mà bạn tìm kiếm.

4

Không biến đối tượng mã hóa thành hậu duệ. Đặt nó làm trang trí hoặc proxy. Đối tượng chính không cần phải biết liệu nó có mã hóa mọi thứ hay không. Thay vào đó, nó sẽ có một đối tượng truyền dữ liệu (lớp socket) gửi và nhận dữ liệu, và nếu đối tượng truyền dữ liệu đó xảy ra là một thứ mã hóa dữ liệu trước khi truyền nó đến đối tượng socket thực, thì hãy là nó. Đó không phải là mối quan tâm của đối tượng chính.

Với proxy, lớp mã hóa sẽ có cùng giao diện với đối tượng socket. Nó sẽ bọc đối tượng socket và đối tượng chính sẽ nói chuyện với socket thông qua đối tượng mã hóa. Nếu bạn không muốn mã hóa, sau đó gán đối tượng socket cho đối tượng chính trực tiếp và bỏ qua người trung gian.

Với trang trí, đối tượng chính sẽ nói trực tiếp với đối tượng socket, nhưng đối tượng socket sẽ chạy mọi thứ thông qua đối tượng mã hóa trước khi gửi nó dọc theo dây. Nếu không có bộ trang trí, thì đối tượng socket sẽ gửi trực tiếp dữ liệu.

Trang trí và proxy được bao phủ trong các Mẫu thiết kế của Fowler, bao gồm các ví dụ trong C++.

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