Thiết kế: Gọi lại cho lớp cha


13

Khi mô hình hóa một đối tượng với trẻ em, thường bao gồm trẻ em thông qua thành phần, với tư cách là thành viên của lớp cha mẹ. Tuy nhiên, đôi khi trẻ cần nói với cha mẹ một cái gì đó, chúng cần gọi một chức năng của cha mẹ. Làm thế nào điều này có thể được thực hiện bằng C ++? Một số tùy chọn là:

  1. Làm cho lớp cha toàn cầu do đó các đối tượng con sẽ có thể gọi các hàm thành viên của đối tượng cha.

  2. Tiêm đối tượng cha như một, con trỏ hoặc tham chiếu, vào mọi đối tượng con. Sau đó, khi đứa trẻ cần nói với đối tượng cha mẹ một cái gì đó, nó luôn có thể làm như vậy bởi vì nó có một biến thành viên mà nó có thể sử dụng.

Phương pháp khác để làm điều này là gì? Có một mẫu thiết kế chung hoặc tên cho loại điều này?

Lưu ý rằng tôi quan tâm đến ý tưởng và giải pháp trong C ++ vì các chi tiết sẽ khác nhau trong các ngôn ngữ hướng đối tượng khác. Ví dụ: điểm 2 ở trên có đề cập 'con trỏ hoặc tham chiếu' và cả hai chỉ có thể có trong C ++. C ++ có các tính năng ngôn ngữ không có trong các ngôn ngữ khác, do đó việc triển khai giải pháp cho vấn đề sẽ có khả năng kết hợp các tính năng ngôn ngữ này làm cho giải pháp khác với những gì ai đó có thể nghĩ ra bằng ngôn ngữ khác.


bạn có thể thêm một ví dụ? Đây có phải là một ví dụ hợp lệ cho câu hỏi của bạn? Bạn có một orderobject (= cha mẹ) với orderitems (con cái) và muốn cập nhật tổng số đơn hàng khi số lượng thứ tự thay đổi? hoặc đang nghĩ về một cái gì đó hoàn toàn khác nhau?
k3b

@ k3b Vâng đó là một ví dụ hợp lệ. Một số thông tin ở trẻ đã thay đổi đòi hỏi cha mẹ phải làm gì đó.
sashang

chỉ cần thêm một số tham số hàm tạo và các thành viên dữ liệu tham chiếu cho mỗi lớp con.
tp1

Có phải đứa trẻ cần biết tất cả về cha mẹ, hoặc đơn giản delegatelà đủ?
Julien Guertault

Câu trả lời:


16

Điều đầu tiên đầu tiên, đây có thể là một mùi mã. Quan điểm sử dụng sáng tác cho cha mẹ / con cái là cha mẹ biết về con cái chứ không phải ngược lại. Đặc biệt là nếu mối quan hệ nhiều hơn 'chứa' hơn 'bao gồm'.

Một tham chiếu đến cha mẹ là có thể và khá phổ biến trong C ++. Trong các ngôn ngữ khác, một đối tượng hoặc sự kiện chức năng thường được sử dụng để cho phép trẻ giao tiếp những điều mà người ngoài có thể muốn biết. Đây là một kiểu mẫu xuất bản-thuê bao phổ biến. Tôi nghi ngờ rằng thành ngữ nào nhiều hơn tùy thuộc vào phiên bản C ++ nào bạn đang sử dụng và các tiêu chuẩn của cơ sở mã của bạn.


Trong tình huống của tôi, nó là một mùi mã. Câu trả lời chính xác.
Martin Pfeffer

3

Như những người khác đã chỉ ra, ý tưởng cơ bản của việc tiêm đối tượng cha mẹ làm con trỏ hoặc tham chiếu là cách để đi - về nguyên tắc.

Điều này có một nhược điểm: bạn có được sự phụ thuộc theo chu kỳ giữa cha mẹ và con. Nếu bạn muốn tránh điều đó, hãy định nghĩa một lớp cơ sở trừu tượng (một giao diện) IParentmà cha mẹ bạn kế thừa. IParentnên chứa các phương thức như các hàm ảo mà đứa trẻ muốn gọi. Sau đó, tiêm cha mẹ như một tài liệu tham khảo IParent. Điều này làm cho việc kiểm tra đơn vị con dễ dàng hơn rất nhiều, vì bây giờ bạn có thể thay thế đối tượng cha mẹ một cách dễ dàng bằng một đối tượng giả.

Nếu con bạn chỉ cần gọi một chức năng của đối tượng cha mẹ, một IParentlớp hoàn chỉnh có thể quá khổ. Trong trường hợp này, nó sẽ đủ để đưa một con trỏ tới hàm thành viên vào con hoặc một đối tượng functor đóng gói hàm thành viên đó.


2

Những gì bạn có thể làm là giữ một tài liệu tham khảo cho phụ huynh trong lớp con, theo thành phần. Bằng cách đó, đứa trẻ biết cha mẹ mình và có thể gọi các phương thức công khai trên đó.

Vì vậy, tôi sẽ đi với tùy chọn 2. Mặc dù vậy, bạn phải cẩn thận, khi một đứa trẻ bị xóa khỏi cha mẹ, bạn cần xóa tham chiếu đến cha mẹ trong đứa trẻ và chỉ nó thành null (hoặc cha mẹ mới, nếu nó có một). Hoặc bạn có thể chỉ cần xóa đối tượng con, tùy thuộc vào ngữ cảnh.


1

Truyền cho họ một tham chiếu hoặc một con trỏ đến cha mẹ. Bạn có thể biến họ thành bạn của cha mẹ hoặc đặt phương thức được gọi là công khai. Nếu bạn không muốn thực hiện bất kỳ điều nào ở trên, bạn có thể truyền cho chúng một đối tượng "cầu nối" hiển thị một trong các phương thức của cha mẹ là công khai và chính nó là một lớp lồng nhau của cha mẹ (do đó nó có quyền truy cập vào mọi phương thức cha mẹ ). Điều này có thể là một chút quá phức tạp trong nhiều tình huống, tuy nhiên.


1

2) Tiêm đối tượng cha như một, con trỏ hoặc tham chiếu, vào mọi đối tượng con. Sau đó, khi đứa trẻ cần nói với đối tượng cha mẹ một cái gì đó, nó luôn có thể làm như vậy bởi vì nó có một biến thành viên mà nó có thể sử dụng.

Là một lựa chọn hoàn toàn khả thi. Tất cả các ngôn ngữ hiện đại có một tính năng có thể được sử dụng để chỉ một ngôn ngữ khác.


1

Có một cách tiếp cận tương tự với sự thay đổi nhỏ nhưng mang lại lợi thế:

Nói cha mẹ A chứa thành phần C.

Trong Thành phần C, khai báo InterfaceC và giữ tham chiếu đến nó. Đây là giao diện của thành phần với thế giới bên ngoài.

Parent A thực hiện InterfaceC và đặt tham chiếu của nó trong Hợp phần C. Thành phần C xem Parent A là InterfaceC.

Ý tưởng là: Một thành phần nói chuyện với bên ngoài bằng giao diện của nó.

Những lợi ích của việc sử dụng này so với thiết lập cha mẹ trực tiếp là:

Nói rằng thành phần làm một cái gì đó và nó cần thông báo cho cha mẹ. Nó gọi giao diện. Sau đó, bạn quyết định bạn muốn thay đổi cha mẹ. Thành phần này không quan tâm chút nào và bạn sẽ không thực hiện bất kỳ thay đổi nào trong đó.

Nói sau bạn muốn thông báo cho nhiều đối tượng của một sự kiện. Bạn chỉ cần tạo một danh sách InterfaceC và thêm các tham chiếu đến nó.

Nhược điểm: Một lớp cha sẽ kết thúc việc thực hiện nhiều giao diện (tôi nghĩ rằng đây là một lợi thế, vì bằng cách nhìn vào khai báo lớp, tôi biết ngay ai nói chuyện với nó)


0

Lưu ý đây là c # cụ thể. Tôi không biết nếu c ++ có cái gì đó tương tự.

Nếu bạn có một hình thức gui với các nút bấm, bạn thường có một cách tiếp cận khác bằng cách sử dụng Đăng ký sự kiện còn được gọi là mẫu đăng ký Observer_potype hoặc Xuất bản .

Nút bấm thông thường không biết hình thức cụ thể nơi nó sống. Thay vào đó, nút kích hoạt hoặc xuất bản một sự kiện và biểu mẫu nhận được thông báo đã đăng ký và có thể phản ứng tương ứng.

Bên cạnh gui-s, cơ chế này có thể được sử dụng trong mọi mối quan hệ giữa trẻ em và trẻ em

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.