2009-04-13 40 views
7

Tôi có phương thức setter (setMinimumNumberOfSides) mà tôi muốn ghi đè sau khi sử dụng tổng hợp. Trong đó, tôi đặt một ràng buộc vào biến cá thể để đảm bảo rằng int nằm trong giới hạn nhất định.Ghi đè phương thức setter và lấy thông tin ra

Sau đó trong phương thức init tùy chỉnh, tôi đang đặt một biến mẫu khác (numberOfSides), nhưng tôi cần đảm bảo tối thiểuNumberOfSides và maximumNumberOfSides được đặt đúng trong giới hạn. Tôi đã thử thay đổi giá trị trả về trên setter thành BOOL, vì vậy tôi có thể trả lại YES hoặc NO nếu nó thành công/thất bại, nhưng điều đó đã tạo ra một phương thức xung đột, tôi đoán vì tôi đang sử dụng tổng hợp và ghi đè setter.

Làm cách nào để tôi có thể lấy thông tin dễ dàng hơn để kiểm tra xem trình cài đặt đã được gọi và trả về thành công chưa?

-(void)setNumberOfSides:(int)sides 
{ 
    if ((sides < maximumNumberOfSides) && (sides > minimumNumberOfSides)) 
    { 
     numberOfSides = sides; 
    } 
    else 
     NSLog (@"Invalid number of sides: %d is outside the constraints allowed", sides); 


} 

-(void)setMinimumNumberOfSides:(int)minimum 
{ 
    if (minimum > 2) 
     minimumNumberOfSides = minimum; 

} 

-(void)setMaximumNumberOfSides:(int)maximum 
{ 
    if (maximum <= 12) 
     maximumNumberOfSides = maximum; 

} 

-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max 
{ 
    if (self = [super init]) 
    { 
     self.minimumNumberOfSides = min; 
     self.maximumNumberOfSides = max; 

     self.numberOfSides = sides; 
    } 
    return self; 
} 

Trả lời

7

Bạn không cần phải tổng hợp numberOfSides nếu bạn dự định triển khai trình khởi động và thiết lập. Nếu không có @synthesize numberOfSides bạn có thể trả lại BOOL nếu bạn chọn. Bạn sẽ cần phải khai báo getter/setter trong giao diện của bạn cho phù hợp.

BTW, cách tiếp cận khác sẽ là sử dụng bộ thu thập/thiết lập tổng hợp và thêm phương thức riêng -(BOOL)isNumberOfSidesValid thực hiện kiểm tra này.

+0

Đánh bại tôi. +1 –

3

Trong tình huống như thế này, bạn có thể nên sử dụng một cuộc gọi đơn giản tới assert() hoặc ném ngoại lệ.

Lựa chọn sẽ tùy thuộc vào cách bạn xem lớp này đang được sử dụng. Nếu nó sẽ là một phần của thư viện và bạn mong đợi các nhà phát triển khác thường xuyên cung cấp các giá trị không chính xác cho minimumNumberOfSides hoặc maximumNumberOfSides, bạn có thể nên ném một ngoại lệ thích hợp.

Một lời cảnh báo. Nếu bạn mong đợi người dùng của ứng dụng của bạn thường xuyên cung cấp các giá trị không chính xác, thì ngoại lệ là ý tưởng tồi. Xử lý ngoại lệ trong Objective-C là một hoạt động tốn kém. Nếu các kiểm tra này được thực hiện vì lợi ích của người dùng, bạn nên thực hiện xác thực đầu vào và báo cáo lỗi cho người dùng theo cách thân thiện hơn nhiều.

chỉnh sửa: Dưới đây là một số mẫu mã nhanh:

-(void)setMinimumNumberOfSides:(int)minimum 
{ 
    if (minimum <= 2) 
    { 
     [NSException raise:@"invalid minimumNumberOfSides value" 
        format:@"value of %d is too low (must be > 2)", minimum]; 
    } 

    minimumNumberOfSides = minimum; 
} 

chỉnh sửa: Đây là another SO question mà đi vào chi tiết về xử lý ngoại lệ trong Objective-C.

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