C ++ truyền lớp cho hàm tạo
Lớp được tạo chứa một biến thể hiện và một thuộc tính cho mỗi thành viên dữ liệu Slice. Xem xét định nghĩa lớp sau Lát cắt class TimeOfDay { short hour; // 0 - 23 short minute; // 0 - 59 short second; // 0 - 59 string format(); // Return time as hh:mm:ss } Trình biên dịch Slice tạo mã sau cho định nghĩa này Mục tiêu-C @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end Có một số điều cần lưu ý về mã được tạo
Quay lại đầu trang ^ Bắt nguồn từ@interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end8 trong Mục tiêu-C Tất cả các lớp cuối cùng đều xuất phát từ một lớp cơ sở chung, @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end8. Lưu ý rằng điều này không giống với việc triển khai giao thức @protocol ICEObject0 (do proxy triển khai). Do đó, bạn không thể vượt qua một lớp mà proxy được mong đợi (và ngược lại) vì các loại cơ sở cho các lớp và proxy không tương thích @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end8 định nghĩa một số phương pháp Mục tiêu-C @protocol ICEObject Các phương thức được phân chia giữa giao thức và lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end8 vì các lớp có thể là người phục vụ Các phương thức của @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end8 hoạt động như sau
Quay lại đầu trang ^ Thành viên dữ liệu lớp trong Objective-CTheo mặc định, các thành viên dữ liệu của các lớp được ánh xạ chính xác như đối với cấu trúc và ngoại lệ. đối với mỗi thành viên dữ liệu trong định nghĩa Slice, lớp được tạo chứa một thuộc tính tương ứng Quay lại đầu trang ^ Trình tạo lớp trong Mục tiêu-CCác lớp cung cấp phương thức @protocol ICEObject1 thông thường và một hàm tạo tiện lợi không có tham số để thực hiện khởi tạo mặc định các biến thể hiện của đối tượng. Các phương thức này khởi tạo các biến thể hiện với bộ nhớ trống, với các ngoại lệ sau
Nếu bạn khai báo các giá trị mặc định trong định nghĩa Slice của mình, phương thức @protocol ICEObject1 và hàm tạo tiện lợi sẽ khởi tạo từng thành viên dữ liệu bằng giá trị đã khai báo của nó thay thế Ngoài ra, nếu một lớp có các thành viên dữ liệu, nó sẽ cung cấp một phương thức @protocol ICEObject1 và một hàm tạo tiện lợi chấp nhận một đối số cho mỗi thành viên dữ liệu. Điều này cho phép bạn phân bổ và khởi tạo một thể hiện lớp trong một câu lệnh (thay vì trước tiên phải phân bổ và khởi tạo mặc định thể hiện rồi gán cho các thuộc tính của nó) Đối với các lớp dẫn xuất, phương thức @protocol ICEObject1 và hàm tạo tiện lợi có một tham số cho mỗi thành viên dữ liệu của lớp cơ sở, cộng với một tham số cho mỗi thành viên dữ liệu của lớp dẫn xuất, theo thứ tự từ cơ sở đến lớp dẫn xuất. Ví dụ Lát cắt @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end6 Điều này tạo ra Mục tiêu-C @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end6 Quay lại đầu trang ^ Các lớp dẫn xuất trong Objective-CLưu ý rằng, trong ví dụ trước, dẫn xuất của các định nghĩa Slice được giữ nguyên cho các lớp được tạo. @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end69 xuất phát từ @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end8 và @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end91 xuất phát từ @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end69. Điều này cho phép bạn xử lý và vượt qua các lớp một cách đa hình. bạn luôn có thể vượt qua một phiên bản @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end91 trong khi một phiên bản @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end69 được mong đợi Quay lại đầu trang ^ Truyền các lớp dưới dạng tham số trong Objective-CCác lớp được truyền bởi con trỏ, giống như bất kỳ đối tượng Objective-C nào khác. Ví dụ: đây là một thao tác chấp nhận @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end95 làm tham số trong và trả về @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end96 Lát cắt @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end9 Phương thức proxy tương ứng trông như sau Mục tiêu-C @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end6 Để vượt qua một phiên bản null, bạn chỉ cần vượt qua @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end97 Quay lại đầu trang ^ Hoạt động của các lớp trong Objective-CNếu bạn nhìn lại mã được tạo cho lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end7, bạn sẽ nhận thấy rằng không có dấu hiệu nào cho thấy lớp đó có thao tác @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end99. Trái ngược với proxy, các lớp không thực hiện bất kỳ giao thức nào sẽ xác định hoạt động nào khả dụng. Điều này có nghĩa là bạn có thể thực hiện một phần các hoạt động của một lớp. Ví dụ: bạn có thể có một lớp Slice với năm thao tác được trả về từ máy chủ cho máy khách. Nếu máy khách chỉ sử dụng một trong năm thao tác, mã phía máy khách chỉ cần triển khai một thao tác đó và có thể để bốn thao tác còn lại không cần triển khai. (Nếu lớp thực hiện một giao thức bắt buộc, mã phía máy khách sẽ phải thực hiện tất cả các hoạt động để tránh cảnh báo của trình biên dịch. ) Tất nhiên, bạn phải thực hiện những thao tác mà bạn thực sự định gọi. Ánh xạ hoạt động cho các lớp tuân theo ánh xạ phía máy chủ cho hoạt động trên giao diện. các loại tham số và nhãn hoàn toàn giống nhau. (Xem Truyền tham số trong Mục tiêu-C để biết chi tiết. ) Tóm lại, ánh xạ phía máy chủ giống như ánh xạ phía máy khách ngoại trừ đối với các loại có biến thể có thể thay đổi và không thể thay đổi, chúng ánh xạ tới biến thể không thể thay đổi trong đó ánh xạ phía máy khách sử dụng biến thể có thể thay đổi và ngược lại Ví dụ: đây là cách chúng tôi có thể triển khai hoạt động @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end99 của lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end61 của chúng tôi Mục tiêu-C @protocol ICEObject2 Theo quy ước, việc triển khai các lớp có thao tác có cùng tên với lớp Slice có hậu tố @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end62. Làm điều này là không bắt buộc - bạn có thể gọi lớp triển khai của mình bất cứ thứ gì bạn thích. Tuy nhiên, nếu bạn không muốn sử dụng cách đặt tên ______462-hậu tố, chúng tôi khuyên bạn nên áp dụng một quy ước đặt tên khác và tuân theo quy ước đó một cách nhất quán Lưu ý rằng @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end64 bắt nguồn từ @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end7. Điều này là do, như chúng ta sẽ thấy trong giây lát, thời gian chạy Ice sẽ khởi tạo một thực thể @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end64 bất cứ khi nào nó nhận được một thực thể @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end61 qua dây và mong muốn thực thể đó cung cấp các thuộc tính của @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end7 Quay lại đầu trang ^ Class Factory trong Objective-CSau khi tạo một lớp chẳng hạn như @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end64, chúng tôi có một triển khai và chúng tôi có thể khởi tạo lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end64, nhưng chúng tôi không thể nhận nó dưới dạng giá trị trả về hoặc dưới dạng tham số ngoài từ lệnh gọi thao tác. Để biết lý do tại sao, hãy xem xét giao diện đơn giản sau Lát cắt @protocol ICEObject2 Khi một ứng dụng khách gọi thao tác @protocol ICEObject21, thời gian chạy Ice phải khởi tạo và trả về một phiên bản của lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end64. Tuy nhiên, trừ khi chúng tôi nói với nó, Ice run time không thể biết một cách kỳ diệu rằng chúng tôi đã tạo một lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end64 triển khai phương thức @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end99. Để cho phép thời gian chạy Ice khởi tạo đúng đối tượng, chúng tôi phải cung cấp cho một nhà máy biết rằng lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end61 Slice được triển khai bởi lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end64 của chúng tôi Để cung cấp thời gian chạy Ice với một nhà máy giá trị cho lớp _______464 của chúng tôi, chúng tôi phải triển khai giao diện @protocol ICEObject28 Lát cắt @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end1 Trong Objective-C, giao diện này được tạo dưới dạng @protocol ICEObject29. Thời gian chạy Ice gọi khối value factory khi nó cần khởi tạo một lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end61. Đây là một triển khai có thể có của nhà máy giá trị của chúng tôi Mục tiêu-C @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end0 Khối block được chuyển ID loại của lớp để khởi tạo. Đối với lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end61 của chúng tôi, ID loại là @protocol ICEObject22. Quá trình triển khai của chúng tôi kiểm tra ID loại. nếu khớp với @protocol ICEObject22, nó sẽ khởi tạo và trả về một đối tượng @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end64. Đối với ID loại khác, nó khẳng định vì nó không biết cách khởi tạo các loại đối tượng khác. Khi sử dụng tính năng đếm tham chiếu tự động (ARC), bạn nên chỉ định @protocol ICEObject25 trong định nghĩa khối. Không cần thiết nếu bạn không sử dụng ARC nhưng nhà máy của bạn không được tự động phát hành phiên bản trả về. Thời gian chạy băng thay mặt bạn đảm nhận các hoạt động quản lý bộ nhớ cần thiết Đưa ra một triển khai của nhà máy, chẳng hạn như triển khai mà chúng tôi đã chỉ định cho @protocol ICEObject26, chúng tôi phải thông báo cho Ice run time về sự tồn tại của nhà máy Mục tiêu-C @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end1 Bây giờ, bất cứ khi nào Ice run time cần khởi tạo một lớp có loại ID @protocol ICEObject22, nó sẽ gọi khối của chúng tôi, khối này sẽ trả về một thể hiện @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end64 cho Ice run time Cuối cùng, hãy nhớ rằng nếu một lớp chỉ có các thành viên dữ liệu, nhưng không có hoạt động, thì bạn không cần phải tạo và đăng ký một nhà máy giá trị để nhận các phiên bản của lớp đó. Bạn chỉ được yêu cầu đăng ký một nhà máy giá trị khi một lớp có hoạt động Quay lại đầu trang ^ Sử dụng một danh mục để thực hiện các hoạt động trong Objective-CMột cách khác để đăng ký một nhà máy giá trị là sử dụng danh mục Mục tiêu-C để thực hiện các hoạt động. Ví dụ: thay vào đó, chúng tôi có thể đã triển khai phương thức @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end99 của mình bằng cách sử dụng một danh mục Mục tiêu-C @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end2 Trong trường hợp này, không cần phải xuất phát từ lớp @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end7 đã tạo vì chúng tôi cung cấp triển khai @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end99 dưới dạng danh mục. Cũng không cần phải đăng ký một nhà máy giá trị. thời gian chạy Ice khởi tạo một đối tượng @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end7 khi một đối tượng @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end61 đến qua dây và phương thức @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end99 được tìm thấy trong thời gian chạy khi nó thực sự được gọi Đây là một cách tiếp cận thay thế khả thi để thực hiện các hoạt động của lớp. Tuy nhiên, hãy nhớ rằng, nếu việc triển khai hoạt động yêu cầu sử dụng các biến thể hiện không được định nghĩa như một phần của định nghĩa Slice của một lớp, thì bạn không thể sử dụng phương pháp này vì các danh mục Mục tiêu-C không cho phép bạn thêm các biến thể hiện vào một Quay lại đầu trang ^ Sao chép các lớp trong Mục tiêu-CCác lớp triển khai @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end15. Hành vi giống như đối với các cấu trúc, đó là bản sao nông. Để minh họa điều này, hãy xem xét định nghĩa lớp sau Lát cắt @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end3 Chúng tôi có thể khởi tạo hai phiên bản của loại @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end16 như sau Mục tiêu-C @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end4 Điều này tạo ra tình huống hiển thị dưới đây
@interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end16 Bây giờ, chúng ta tạo một bản sao của nút đầu tiên bằng cách gọi @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end18 Mục tiêu-C @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end5 Điều này tạo ra tình huống hiển thị ở đây @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end16 trường hợp sau khi gọi @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end18 trên @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end01 Như bạn có thể thấy, nút đầu tiên được sao chép, nhưng nút cuối cùng (được chỉ ra bởi biến thể hiện @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end02 của nút đầu tiên) không được sao chép; Tham chiếu theo chu kỳ trong Mục tiêu-CMột điều cần lưu ý là các tham chiếu theo chu kỳ giữa các lớp. Ví dụ, chúng ta có thể dễ dàng tạo một chu trình bằng cách thực hiện các câu lệnh sau Mục tiêu-C @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end6 Điều này làm cho biến thể hiện @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end02 của hai lớp trỏ vào nhau, tạo ra chu trình như bên dưới
Không có vấn đề gì khi gửi biểu đồ lớp này làm tham số. Ví dụ: bạn có thể chuyển @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end01 hoặc @interface EXTimeOfDay : ICEObject { ICEShort hour; ICEShort minute; ICEShort second; } @property(nonatomic, assign) ICEShort hour; @property(nonatomic, assign) ICEShort minute; @property(nonatomic, assign) ICEShort second; -(id) init:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; +(id) timeOfDay; +(id) timeOfDay:(ICEShort)hour minute:(ICEShort)minute second:(ICEShort)second; @end08 làm tham số cho một thao tác và trong máy chủ, thời gian chạy Ice sẽ xây dựng lại biểu đồ tương ứng một cách trung thực, duy trì chu kỳ. Tuy nhiên, nếu máy chủ trả về một biểu đồ như vậy từ một lệnh gọi thao tác dưới dạng giá trị trả về hoặc dưới dạng tham số ngoài, thì tất cả các phiên bản lớp là một phần của chu trình đều bị rò rỉ. Điều này cũng đúng ở phía khách hàng. nếu bạn nhận được một biểu đồ như vậy từ một lời gọi hoạt động và không phá vỡ chu trình một cách rõ ràng, thì bạn sẽ rò rỉ tất cả các phiên bản tạo thành một phần của chu trình Bởi vì rất khó để phá vỡ các chu kỳ theo cách thủ công (và, về phía máy chủ, đối với các giá trị trả về và tham số ngoài, không thể phá vỡ chúng), chúng tôi khuyên bạn nên tránh các tham chiếu theo chu kỳ giữa các lớp |