Tôi hiểu rằng chúng ta không nên thay đổi trực tiếp các con của gốc tổng hợp, mà thay vào đó chúng phải được thực hiện thông qua các phương pháp trên thư mục gốc. Ví dụ: order.SetOrderLineQty(product, qty);
Truy cập các Thành viên Tổng hợp được Phân loại Thành viên
Nhưng điều gì xảy ra nếu con cái của tập hợp gốc là nội dung trừu tượng? Hãy tưởng tượng bạn có Gốc tổng hợp xe hơi, chứa danh sách IWheel như một phần của tổng hợp. Làm thế nào bạn sẽ thêm/thay đổi các thuộc tính của bánh xe thông qua tổng hợp của nó-root (những người không biết gì về những loại bê tông của bánh xe họ có thể được)?
Ví dụ thế giới thực hơn là: Bác sĩ có thể tạo MedicalRerport (tổng hợp), chứa danh sách IMedicalNote (như một phần của tổng hợp MedicalReport). IMedicalNote là một lớp cơ sở/giao diện, được phân loại thành một vài lớp con cụ thể, ví dụ: BloodCheckNote, TemperatureNote, MineralConcentrationNote, v.v.
Mỗi phân lớp có các thuộc tính khác nhau và tất cả đều có thể chỉnh sửa. Tổng hợp MedicalReport có thể chứa một hoặc nhiều trong số các ghi chú này. (Mỗi phân lớp ghi chú có một điều khiển người dùng cụ thể để người dùng nhập/cập nhật chi tiết, được hiển thị dưới dạng bảng/tab trong màn hình Báo cáo y tế lớn)
Câu hỏi của tôi là, làm cách nào để thêm/chỉnh sửa các thuộc tính này ghi chú nghiêm ngặt thông qua tổng hợp-gốc của nó (MedicalReport)? Kể từ khi tôi không được phép thay đổi các ghi chú tài sản trực tiếp, một lựa chọn xấu xí là do phơi bày tất cả các thuộc tính lưu ý có thể vào thư mục gốc tổng hợp (MedicalReport), ví dụ:
report.SetWhiteBloodCellCount(cellCount);
report.SetBloodCheckComment(comment);
report.SetTemperature(bodyPart, temperature);
report.AddMineral(mineral, concentration);
Mỗi phương pháp sẽ cập nhật (hoặc tạo mới) lưu ý các mục trong bộ sưu tập trẻ em nội bộ của nó. Có 2 vấn đề rõ ràng với điều này:
- Chúng tôi phải xác định trước tất cả các thuộc tính có sẵn của tất cả các lớp con IMedicalNote có thể trên tổng hợp gốc. Điều đó không thể chấp nhận được vì số lượng lớp con được đảm bảo phát triển, phụ thuộc vào loại dữ liệu y tế mà chúng tôi muốn nắm bắt, đó là toàn bộ điểm của thừa kế ở vị trí đầu tiên.
- Có thể có nhiều phiên bản của cùng loại ghi chú trong danh sách. API này sẽ thất bại, vì chúng tôi không thể chỉ nói
report.SetBloodCheckComment(comment)
và hy vọng nó sẽ cập nhật một mục BloodCheckNote trong danh sách, bởi vì chúng tôi cho phép nhiều hơn một mục BloodCheckNote trong danh sách.
Tôi vẫn muốn duy trì tất cả các tương tác với các ghi chú này thông qua gốc tổng hợp của nó, vì nó phải kiểm soát liệu toàn bộ tập hợp MedicalReport có hợp lệ hay không, cho dù tổng hợp không thể sửa đổi, lạc quan kiểm tra đồng thời, vv Nhưng làm thế nào tôi có thể làm điều đó?
Hiểu biết của tôi là bạn có thể truy xuất đối tượng bên trong (IMedicalNote) nhưng chỉ cho mục đích chỉ đọc. Bạn không được phép sửa đổi nó. Tất cả các sửa đổi phải được thực hiện thông qua thư mục gốc để nó có thể kiểm soát tính toàn vẹn. Ngoài ra, những gì bạn có nghĩa là bằng cách chuyển nó trở lại gốc? Một khi chúng ta sửa đổi thuộc tính của đứa trẻ bên ngoài, thì đó là nó, nó đã thay đổi (bằng cách tham chiếu), bỏ qua gốc, phải không? "Quay lại gốc" làm gì? – Sheepy
Xin lỗi, trả lời phần nào mơ hồ. Root truyền lại các bản sao của các đối tượng mà khách hàng sau đó cập nhật và chuyển về gốc. Root sau đó chịu trách nhiệm kiểm tra các bất biến và thiết lập các mối quan hệ. Cung cấp một phân chia trách nhiệm hợp lý: root biết về các mối quan hệ và ràng buộc giữa các đối tượng tổng hợp nhưng không cần biết chi tiết của tất cả các kiểu con. Khách hàng có thể hoạt động trên các kiểu con cụ thể theo yêu cầu. Lưu ý Gốc có thể cần phải biết một số chi tiết loại phụ (ví dụ: nếu nó phải giữ chính xác một 'BloodCheckNote' nhưng có thể có nhiều' TemperatureNote's). – sfinnie
Bạn muốn tạo một cơ chế sao chép sao cho thư mục gốc sẽ luôn trả về một bản sao của mỗi chú thích con khi được truy cập thông qua trình thu thập công khai của root? Và sau đó một cách để sao chép các giá trị này trở lại đối tượng thực tế của nó khi khách hàng trả lại những đứa trẻ này trở lại thư mục gốc. Chỉ muốn làm rõ nếu đó là những gì bạn có nghĩa là, bởi vì nó có vẻ giống như một chút công việc. Chúc mừng – Sheepy