2010-06-30 34 views

Trả lời

12

Sử dụng chiếc xe cũ tương tự mệt mỏi ...

Hãy nghĩ đến một Lớp như là một nhà máy sản xuất Instances của lớp học. Ví dụ, bạn có thể có một lớp Car và bạn có thể khai báo một phương pháp như:

+ carWithColor: (NSColor *) aColor; 

Và rằng phương pháp sau đó sẽ tạo ra một trường hợp xe mới, thiết lập màu sắc, và gửi lại:

+ carWithColor: (NSColor *) aColor 
{ 
    Car *aCar = [[[self alloc] init] autorelease]; 
    [aCar paintWithColor: aColor]; 
    return aCar; 
} 

Bây giờ, lớp xe đó sau đó sẽ tuyên bố một phương pháp thể hiện cho phép chiếc xe được sơn. Tại sao một phương pháp dụ? Bởi vì mỗi chiếc xe có thể có một màu sắc khác nhau (và màu sắc của chiếc xe có thể sẽ được lưu trữ trong một biến ví dụ).

- (void) paintWithColor: (NSColor *) aColor 
{ 
    ... do your paint stuff here ... 
} 

Điều này được giải thích trong phần Objects, Classes, and Messaging của tài liệu hướng dẫn-C.

-1

phương pháp lớp chữ ký được bắt đầu với +, phương pháp dụ với - vì vậy trong tờ khai tập tin tiêu đề của bạn sẽ trông như thế này:

-(void)setAllThings:(NSArray*)things; //instance method 
+(void)setAllClassThings:(NSArray*)things; //class method 

Và tất nhiên các quy tắc tương tự áp dụng khi bạn xác định các phương pháp trong. m tập tin.

+0

tôi biết cách chúng khai báo cùng với cú pháp của nó. Nhưng tôi không biết khái niệm đằng sau lý do tại sao chúng ta cần triển khai phương thức lớp và phương thức mẫu? – Tirth

+1

iHungry, suy nghĩ về khi bạn không cần dụ một đối tượng, hoặc thiết lập getter hoặc setters, và có lẽ lấy một cái gì đó có nguồn gốc mà không thực sự khởi tạo một đối tượng, sau đó các phương thức lớp trở nên tiện dụng. Kể từ khi phân bổ và khởi tạo các phương thức lớp xảy ra trong nền, bạn có thể gọi một phương thức lớp và lấy lại trong một dạng nào đó, mà không khởi tạo đối tượng và trải qua quá trình phân bổ, init và release. Nếu bạn nhận thấy trong tiêu đề mặc định của iOS, bạn sẽ nhận thấy hầu hết các lần các phương thức lớp đang trả về cho bạn một đối tượng. – kforkarim

0

Instance phương pháp làm việc với trường của một lớp:

NSString *myString; 
myString = [[[NSString alloc] initWithString:@"Hello, world."] autorelease]; 
NSLog (@"myString's length: %u", [myString length]); // instance method 

Lớp phương pháp có thể làm đẳng cấp cụ thể điều mà không dựa vào một trường hợp đối tượng, thường trở về một thể hiện của lớp học hoặc một số kết quả cụ thể cho từng lớp khác:

NSLog (@"%@", [NSString stringWithString:@"Hello, world."]); // class method 

I t hink nó có thể là hiếm để xem phương pháp lớp học mà không trả lại một cái gì đó.

+0

Một ví dụ về một phương thức lớp không trả về bất cứ thứ gì là '[UIView + setAnimationsEnabled:]' - nghĩa là, một phương thức lớp có thể áp dụng các thay đổi cho tất cả các cá thể. –

0

Bạn không cần triển khai cả hai. Hoặc là tùy chọn có sẵn cho bạn khi bạn thiết kế lớp học của mình.

Phương pháp thể hiện có thể hoạt động trên phiên bản của lớp. Điều này có thể nhận được hoặc thiết lập một thuộc tính, hoặc gây ra hành vi mà bạn chỉ muốn cá thể đó thực hiện. Bạn cần phải thực sự có một ví dụ để sử dụng nó. Chúng có thể sử dụng hoặc thay đổi trạng thái của cá thể.

// Notional instance methods 
myHouse.color = blueColor; 

[myCar accelerate]; 
speed = myCar.speed; 

Phương thức lớp hoạt động trên khái niệm tồn tại của lớp. Nó có thể được sử dụng để tạo một cá thể hoặc thực hiện một phép tính không phụ thuộc vào việc có một cá thể. Bạn có thể có một lớp cho trình trợ giúp toán học tùy chỉnh, về cơ bản có chứa các hàm.

// Notional class method uses 
myString = [NSString stringWithFormat:@"&f", floatToConvert]; 

myResult = [MyMathHelper MyFunctionWithInput:myInput]; 
6

Đây là một bài đăng cũ, nhưng kể từ khi nó xuất hiện đầu tiên trong tìm kiếm của Google, tôi nghĩ tôi sẽ thêm vào nó.

Tôi sẽ không nói về các phương pháp lớp được sử dụng làm phương pháp nhà máy. Tôi muốn nói về việc sử dụng chúng trong các phương thức tiện ích.Bạn có thể/nên sử dụng các phương thức lớp cho các phương thức tiện ích độc lập với trạng thái. Điều đó có nghĩa là gì? Ví dụ, nếu bạn đang định dạng một ngày theo cùng một cách cho tất cả các cá thể, đó là một phương thức tiện ích nên là một phương thức lớp. Hãy suy nghĩ về phương pháp tiện ích như một trình điều khiển vít. Bạn không cần phải thực hiện một trường hợp mới của trình điều khiển vít mỗi khi bạn muốn làm một cái gì đó với nó. Trình điều khiển vít vẫn không đổi. Vì vậy, ví dụ, tôi có một lớp bao gồm một phương thức riêng tạo ra một chuỗi các emDashes được sử dụng để hiển thị cho khung nhìn. Phương pháp này không phụ thuộc vào trạng thái và do đó sẽ không thay đổi theo từng trường hợp. Hãy nghĩ về các phương thức tiện ích lớp như hằng số.

+ (NSString *)emDashString { 
return @" \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014"; 

}

Bạn có thể gọi phương pháp này quát trong lớp (đó là tư nhân trong ví dụ của tôi) như thế này:

NSString *string = [[self class] emDashString ]; 

Tôi đã cố tình chọn một chút của một ví dụ nhỏ để lái xe về nhà. Bạn sẽ chỉ bận tâm làm cho một phương thức tiện ích lớp này nếu bạn cần chuỗi này nhiều hơn một lần trong lớp của bạn. Lưu ý rằng thay vì đề cập đến lớp theo tên, tôi gọi nó một cách tổng quát với [self class] vì nó được gọi là nội bộ. Nếu nó bị lộ ra và bạn muốn gọi nó từ một lớp khác thì hãy gọi nó bằng tên lớp như thường lệ.

+0

Tôi thích giải thích này tốt hơn ý tưởng nhà máy. Sau khi tất cả, một thể hiện xe có thể được tạo ra bằng cách sử dụng: Car * car = [[Car alloc] init]; Và sau đó được vẽ bằng một phương pháp thể hiện khác, vì vậy tôi không thực sự thấy sự tương tự của Nhà máy là rất hữu ích. Nhưng ý tưởng trạng thái/không quốc tịch rất hữu ích và sử dụng các phương thức Lớp để trả về các giá trị không đổi. Giải thích tuyệt vời. –

+0

Và tôi đoán, có ít chi phí khi gọi một phương thức lớp học, đó là lý do tại sao điều quan trọng là phải hiểu khi nào nên sử dụng chúng. –

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