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

  1. 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;
    @end
    
    7 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;
    @end
    
    8, là lớp cha của tất cả các lớp. 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;
    @end
    
    8 không giống như 
    @protocol ICEObject 
    -(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
    -(void) ice_ping:(ICECurrent*)current;
    -(NSString*) ice_id:(ICECurrent*)current;
    -(NSArray*) ice_ids:(ICECurrent*)current;
    -(void) ice_dispatch:(id)request;
    @end
    
    @interface ICEObject : NSObject 
    -(BOOL) ice_isA:(NSString*)typeId;
    -(void) ice_ping;
    -(NSString*) ice_id;
    -(NSArray*) ice_ids;
    +(NSString*) ice_staticId;
    -(void) ice_preMarshal;
    -(void) ice_postUnmarshal;
    -(id) ice_getSlicedData;
    @end
    0. Nói cách khác, bạn không thể vượt qua một lớp mà proxy được yêu cầu và ngược lại
  2. Lớp được tạo chứa một thuộc tính cho mỗi thành viên dữ liệu Slice
  3. Lớp được tạo cung cấp một phương thức 
    @protocol ICEObject 
    -(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
    -(void) ice_ping:(ICECurrent*)current;
    -(NSString*) ice_id:(ICECurrent*)current;
    -(NSArray*) ice_ids:(ICECurrent*)current;
    -(void) ice_dispatch:(id)request;
    @end
    
    @interface ICEObject : NSObject 
    -(BOOL) ice_isA:(NSString*)typeId;
    -(void) ice_ping;
    -(NSString*) ice_id;
    -(NSArray*) ice_ids;
    +(NSString*) ice_staticId;
    -(void) ice_preMarshal;
    -(void) ice_postUnmarshal;
    -(id) ice_getSlicedData;
    @end
    1 chấp nhận một đối số cho mỗi thành viên dữ liệu và nó cung cấp hai hàm tạo tiện lợi giống như cấu trúc và ngoại lệ

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;
@end
8 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;
@end
8. Lưu ý rằng điều này không giống với việc triển khai giao thức 
@protocol ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
0 (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;
@end
8 định nghĩa một số phương pháp

Mục tiêu-C

@protocol ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end

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;
@end
8 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;
@end
8 hoạt động như sau

  • @protocol ICEObject 
    -(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
    -(void) ice_ping:(ICECurrent*)current;
    -(NSString*) ice_id:(ICECurrent*)current;
    -(NSArray*) ice_ids:(ICECurrent*)current;
    -(void) ice_dispatch:(id)request;
    @end
    
    @interface ICEObject : NSObject 
    -(BOOL) ice_isA:(NSString*)typeId;
    -(void) ice_ping;
    -(NSString*) ice_id;
    -(NSArray*) ice_ids;
    +(NSString*) ice_staticId;
    -(void) ice_preMarshal;
    -(void) ice_postUnmarshal;
    -(id) ice_getSlicedData;
    @end
    8
    Phương thức này trả về 
    @protocol ICEObject 
    -(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
    -(void) ice_ping:(ICECurrent*)current;
    -(NSString*) ice_id:(ICECurrent*)current;
    -(NSArray*) ice_ids:(ICECurrent*)current;
    -(void) ice_dispatch:(id)request;
    @end
    
    @interface ICEObject : NSObject 
    -(BOOL) ice_isA:(NSString*)typeId;
    -(void) ice_ping;
    -(NSString*) ice_id;
    -(NSArray*) ice_ids;
    +(NSString*) ice_staticId;
    -(void) ice_preMarshal;
    -(void) ice_postUnmarshal;
    -(id) ice_getSlicedData;
    @end
    9 nếu đối tượng hỗ trợ ID loại đã cho 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;
    @end
    
    60 nếu khô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;
    @end
    
    61
    @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
    
    61 cung cấp bài kiểm tra khả năng tiếp cận cơ bản cho lớp học. Nếu nó hoàn thành mà không đưa ra một ngoại lệ, thì lớp tồn tại và có thể truy cập được. 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;
    @end
    
    61 thường chỉ được gọi trên proxy cho một lớp có thể ở xa vì luôn có thể truy cập được một phiên bản lớp cục bộ (trong không gian địa chỉ của trình 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;
    @end
    
    64
    Phương thức này trả về một chuỗi chuỗi đại diện cho tất cả các ID loại được đối tượng này hỗ trợ, bao gồm 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
    
    65.
  • @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
    
    66
    Phương thức này trả về ID loại thời gian chạy thực tế cho một lớp. Nếu bạn 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;
    @end
    
    66 thông qua một con trỏ tới một phiên bản cơ sở, ID loại được trả về là ID loại thực tế (có thể có nguồn gốc hơn) của 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;
    @end
    
    68
    Phương thức này trả về ID loại tĩnh của 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;
    @end
    
    69
    Phương thức này gửi yêu cầu đến cho một người hầu. Nó được sử dụng trong quá trình triển khai thiết bị chặn công vă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;
    @end
    
    60
    Thời gian chạy băng gọi phương thức này trước khi sắp xếp lại trạng thái của đối tượng, tạo cơ hội cho lớp con xác thực các thành viên dữ liệu đã khai báo của 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;
    @end
    
    61
    Thời gian chạy băng gọi phương thức này sau khi sắp xếp lại trạng thái của đối tượng. Một lớp con thường ghi đè chức năng này khi nó cần thực hiện khởi tạo bổ sung bằng cách sử dụng các giá trị của các thành viên dữ liệu đã khai báo của 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;
    @end
    
    62
    Hàm này trả về đố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;
    @end
    
    63 nếu giá trị đã được cắt lát trong quá trình sắp xếp lại 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;
    @end
    
    64 nếu không.

Quay lại đầu trang ^

Thành viên dữ liệu lớp trong Objective-C

Theo 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-C

Các lớp cung cấp phương thức 

@protocol ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
1 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

  • Một thành viên dữ liệu chuỗi được khởi tạo thành một chuỗi rỗng
  • Một thành viên dữ liệu điều tra viên được khởi tạo cho điều tra viên đầu tiên
  • Thành viên dữ liệu cấu trúc được khởi tạo thành giá trị được tạo mặc định

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 ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
1 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 ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
1 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 ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
1 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;
@end
6

Đ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;
@end
6

Quay lại đầu trang ^

Các lớp dẫn xuất trong Objective-C

Lư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;
@end
69 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;
@end
8 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;
@end
91 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;
@end
69. Đ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;
@end
91 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;
@end
69 được mong đợi

Quay lại đầu trang ^

Truyền các lớp dưới dạng tham số trong Objective-C

Cá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;
@end
95 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;
@end
96

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;
@end
9

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;
@end
6

Để 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;
@end
97

Quay lại đầu trang ^

  Hoạt động của các lớp trong Objective-C

Nế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;
@end
7, 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;
@end
99. 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;
@end
99 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;
@end
61 của chúng tôi

Mục tiêu-C

@protocol ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
2

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;
@end
62. 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;
@end
64 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;
@end
7. Đ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;
@end
64 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;
@end
61 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;
@end
7

Quay lại đầu trang ^

Class Factory trong Objective-C

Sau 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;
@end
64, 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;
@end
64, 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 ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
2

Khi một ứng dụng khách gọi thao tác 

@protocol ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
21, 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;
@end
64. 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;
@end
64 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;
@end
99. Để 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;
@end
61 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;
@end
64 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 ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
28

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;
@end
1

Trong Objective-C, giao diện này được tạo dưới dạng 

@protocol ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
29. 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;
@end
61. Đâ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;
@end
0

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;
@end
61 của chúng tôi, ID loại là 
@protocol ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
22. 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 ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
22, 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;
@end
64. Đố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 ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
25 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 ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
26, 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;
@end
1

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 ICEObject 
-(BOOL) ice_isA:(NSString*)typeId current:(ICECurrent*)current;
-(void) ice_ping:(ICECurrent*)current;
-(NSString*) ice_id:(ICECurrent*)current;
-(NSArray*) ice_ids:(ICECurrent*)current;
-(void) ice_dispatch:(id)request;
@end

@interface ICEObject : NSObject 
-(BOOL) ice_isA:(NSString*)typeId;
-(void) ice_ping;
-(NSString*) ice_id;
-(NSArray*) ice_ids;
+(NSString*) ice_staticId;
-(void) ice_preMarshal;
-(void) ice_postUnmarshal;
-(id) ice_getSlicedData;
@end
22, 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;
@end
64 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-C

Mộ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;
@end
99 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;
@end
2

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;
@end
7 đã 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;
@end
99 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;
@end
7 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;
@end
61 đế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;
@end
99 đượ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-C

Cá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;
@end
15. 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;
@end
3

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;
@end
16 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;
@end
4

Điều này tạo ra tình huống hiển thị dưới đây

C ++ truyền lớp cho hàm 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;
@end
16

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;
@end
18

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
5

Điều này tạo ra tình huống hiển thị ở đây

C ++ truyền lớp cho hàm 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;
@end
16 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;
@end
18 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;
@end
01

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;
@end
02 của nút đầu tiên) không được sao chép;

Tham chiếu theo chu kỳ trong Mục tiêu-C

Mộ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;
@end
6

Đ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;
@end
02 của hai lớp trỏ vào nhau, tạo ra chu trình như bên dưới

C ++ truyền lớp cho hàm tạo

Hai nút có tham chiếu tuần hoàn

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;
@end
01 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;
@end
08 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