เมนูนำทาง
ภาษาอ็อบเจกทีฟ-ซี วากยสัมพันธ์ภาษาอ็อบเจกทีฟ-ซี [1]เป็นชั้นบางๆ บน C และเป็น สตริกต์ superset ของ C ดังนั้นคอมไพเลอร์ภาษาอ็อบเจกทีฟ-ซีจึงสามารถคอมไพล์โปรแกรมภาษา C ใดๆ ก็ได้ ภาษาอ็อบเจกทีฟ-ซี ได้รับรูปแบบการเขียนมาจากภาษาซีและภาษาสมอลล์ทอล์ก โดยรูปแบบส่วนใหญ่ (preprocessing, expressions, การประกาศฟังค์ชัน และการเรียกฟังค์ชัน) มาจากภาษาซี ขณะที่ส่วนที่เป็นการจัดการเชิงวัตถุมาจากสมอลทอล์ค
ภาษาอ็อบเจกทีฟ-ซีได้เพิ่มเติมรูปแบบการเขียนโปรแกรม เพื่อรองรับการออกแบบโปรแกรมเชิงวัตถุ โดยจะใช้การส่ง message ไปยัง object ต่างๆเช่นเดียวกับสมอลทอล์ค ซึ่งแตกต่างจากภาษาในตระกูล Simula (เช่น C++) ข้อแตกต่างมีมีความสำคัญ เพราะภาษาอ็อบเจกทีฟ-ซีจะไม่เรียก method แต่จะส่ง message
ในภาษาอ็อบเจกทีฟ-ซี ถ้ามี object หนึ่งชื่อ obj
โดย class มี method ชื่อ doSomething
หมายความว่า obj
respond หรือตอบสนองต่อ message doSomething
และถ้าเราต้องการจะส่ง message doSomething
ไปยัง obj
เราจะเขียนคำสั่งดังนี้
[obj doSomething];
ขณะที่ถ้าเป็น C++ เราจะเขียนว่า
obj.doSomething () ;
ในภาษาอ็อบเจกทีฟ-ซีจะยอมให้มีการส่ง message ไปยัง object ใดๆ แม้ว่าจะไม่มีการเตรียม method เอาไว้รองรับ (คือไม่ respond) ต่างจากภาษาอื่นๆ เช่น C++ หรือ Java ที่การเรียกใช้ method ต้องมีการระบุไว้ล่วงหน้า หาก object ได้รับ message ที่ไม่รู้จัก object จะผ่านต่อ message ที่ได้รับไปยัง method เหล่านี้
- (retval_t) forward:(SEL) sel :(arglist_t) args; // with GCC- (id) forward:(SEL) sel :(marg_list) args; // with NeXT/Apple systems
method เหล่านี้อาจแตกต่างกันไปตามชนิดของ runtime และมักนิยมผ่านต่อไปยัง method อื่นๆในระดับของ framework เช่น forwardInvocation: [2] ใน OpenStep
ในภาษาอ็อบเจกทีฟ-ซี ส่วนอินเตอร์เฟซ (@interface) และอิมพลีเมนเทชัน (@implementation) จะถูกแยกออกจากกัน ในทางปฏิบัติ เรามักเก็บส่วนอินเตอร์เฟซไว้ในแฟ้ม .h และส่วนอิมพลีเมนเทชันใน .m
เรามักนิยามส่วนอินเตอร์เฟซของคลาสในแฟ้ม .h โดยทั่วไปเรามักตั้งชื่อแฟ้มนี้ให้ตรงหรือสอดคล้องกับชื่อของคลาส เช่นถ้าคลาสเราชื่อ Thing
เราก็มักจะประกาศอินเตอร์เฟซของคลาส Thing
ในแฟ้ม Thing.h
รูปแบบของการประกาศอินเตอร์เฟซมีลักษณะดังนี้:
@interface classname : superclass name{ instance variables}+ classMethod1;+(return_type) classMethod2;+(return_type) classMethod3: (param1_type) parameter_varName;-(return_type) instanceMethod1: (param1_type) param1_varName : (param2_type) param2_varName;-(return_type) instanceMethod2WithParameter: (param1_type) param1_varName andOtherParameter: (param2_type) param2_varName;@end
method แบบ instance จะถูกนำหน้าด้วยเครื่องหมายลบ "-" ส่วน method แบบ class จะถูกนำหน้าโดยเครื่องหมายบวก "+" ตรงนี้จะแตกต่างจาก UML diagrams ซึ่งใช้ในแสดงว่า method เป็นแบบ private หรือ public
ค่าที่ถูก return จาก method มีลักษณะเช่นเดียวกับในภาษาซี เช่น void, int, ฯลฯ โดยจะมีการประกาศ type ชื่อ id ไว้แทน instance อ็อบเจกอะไรก็ได้
เราประกาศพารามิเตอร์ของ method ด้วยเครื่องหมายทวิภาคหรือโคลอน ":" ตามด้วย type ของพารามิเตอร์ในวงเล็บ แล้วตามด้วยชื่อของพารามิเตอร์ เรามักใส่ชื่อที่มีความสอดคล้องกับพารามิเตอร์หน้าเครื่องหมายทวิภาค เพื่อบอกว่าพารามิเตอร์แต่ละตัวมีบทบาทอย่างไร
-(void) setRange: (int) start : (int) end;-(void) importDocumentWithName: (NSString *) name withSpecifiedPreferences: (Preferences *) prefs beforePage: (int) insertPage;
ส่วนอินเตอร์เฟซจะประกาศแต่ต้นแบบของ method เท่านั้น โดยไม่รวมถึงการกำหนดว่า method นั้นจะต้องทำอะไรบ้าง การกำหนดว่า method นั้นจะต้องทำอะไรจะทำในส่วนอิมพลีเมนเทชัน ตามปรกติ ส่วนอิมพลีเมนเทชันจะอยู่ในไฟล์นามสกุล .m ตัวอย่างเช่น Thing.m
ที่มีการกำหนดส่วนอิมพลีเมนเทชันไว้ดังนี้
@implementation classname+ classMethod{ // implementation} - instanceMethod{ // implementation}@end
method มีหน้าตาแตกต่างจากฟังค์ชันในภาษา C เช่นถ้าในภาษาซีเป็นอย่างนี้
int do_something (int i){ return square_root (i) ;}
โดยมี int do_something (int)
เป็นต้นแบบ
เมื่อมาประกาศเป็น method ในภาษาอ็อบเจ็กทีฟ-ซี จะมีหน้าตาอย่างนี้
- (int) do_something: (int) i{ return [self square_root: i];}
ถ้าให้ถูกธรรมเนียมเราจะกำหนดชื่อ method ข้างต้นใหม่ โดยเราจะตั้งชื่อ method ให้สอดคล้องกับ argument ตัวแรกดังนี้
- (int) doSomethingWithInt: (int) i{ return [self squareRootOfInt:i];}
แม้ว่าอาจจะดูยุ่งยากแต่ก็ช่วยให้เราจำ argument ได้ง่ายขึ้น ตัวอย่างเช่น
- (int) changeColorWithRed: (int) r green: (int) g blue: (int) b
โดยเราจะเรียก method แบบนี้:
[myColor changeColorWithRed:5 green:2 blue:6];
คอมไพเลอร์ภาษาอ็อพเจ็กทีฟ-ซีแต่ละตัวก็จะกำหนดชื่อ method เป็นการภายในแตกต่างกันไป เช่นถ้า method -changeColorWithRed:green:blue:
เป็น method แบบ instance ของ class Color
คอมไพเลอร์ก็อาจจำ method นี้ในชื่อ _i_Color_changeColorWithRed_green_blue
เป็นต้น โดยตัว i
จะบอกว่าจุดนี้คืออิมพลีเมนเทชัน method แบบ instance และตามด้วยชื่อคลาสและชื่อ method และมีการเปลี่ยนเครื่องหมาย : เป็น _ ดังนี้แล้ว เมื่อพารามิเตอร์เป็นส่วนหนึ่งของชื่อ method ลำดับของพารามิเตอร์ในภาษาอ็อบเจ็กทีฟ-ซีจึงสลับที่กันไม่ได้
อย่างไรก็ตาม เราแทบไม่ได้ใช้ชื่อภายในของฟังชั่นโดยตรง โดยทั่วไป การส่ง message จะถูกเปลี่ยนให้อยู่ในรูปแบบของการเรียกฟังค์ชั่นที่กำหนดไว้ในไลบราลีส่วน run-time และปรกติเวลาเราส่ง message เราก็จะไม่คำนึงถึง class ที่แท้จริงของส่วน receiver (myColor
) อยู่แล้ว นั่นคือการจัดการหา method จะเป็นหน้าที่ของ run-time
เมนูนำทาง
ภาษาอ็อบเจกทีฟ-ซี วากยสัมพันธ์ใกล้เคียง
ภาษาอังกฤษ ภาษาอาหรับ ภาษาอินโดนีเซีย ภาษาอิตาลี ภาษาอีสาน ภาษาอาฟรีกานส์ ภาษาอังกฤษเก่า ภาษาอาหม ภาษาอียิปต์ ภาษาอีโดแหล่งที่มา
WikiPedia: ภาษาอ็อบเจกทีฟ-ซี http://users.pandora.be/stes/compiler.html http://developer.apple.com/documentation/Cocoa/Con... http://developer.apple.com/documentation/Cocoa/Ref... http://lists.apple.com/archives/Objc-language/2006... http://lists.apple.com/archives/Objc-language/2006... http://www.gnustep.org/resources/documentation/Dev... http://clang.llvm.org/