Difference between revisions of "FPC PasCocoa/Differences"

From Lazarus wiki
Jump to navigationJump to search
Line 34: Line 34:
  
 
===Marking methods as ''override''===
 
===Marking methods as ''override''===
* '''Description''': In Object Pascal, if you want to override an inherited method then you have to add the ''override'' keyword to the declaration in the child class. Without ''override'', the inherited method will be hidden in the syntactic scope of the child class, but when casting the child class to the parent type and call that method, the parent's implementation will still be executed.<p>&nbsp;&nbsp;In Objective-C all dispatching is name-based, and hence a method with the same selector in a child class will always override a parent method with the same name (it is not possible to hide an inherited method, nor to start a new inheritance tree).</p><p>&nbsp;&nbsp;In Objective-Pascal, we also require ''override'' to be specified when overriding inherited Objective-C methods for consistency with Object Pascal. This can also catch some errors, as explained in [http://lists.apple.com/archives/Xcode-users/2009/Aug/msg00251.html this thread]. There is however one exception: for ''external'' classes, the ''override'' is not required because such declarations are often produced using automated parsers, and requiring them to add ''override'' in the right places would needlessly complicate them. Not adding ''override'' in such situations will however still cause the compiler to print a hint.</p>
+
* '''Description''': In Object Pascal, if you want to override an inherited method then you have to add the ''override'' keyword to the declaration in the child class. Without ''override'', the inherited method will be hidden in the syntactic scope of the child class, but when casting the child class to the parent type and call that method, the parent's implementation will still be executed.<p>&nbsp;&nbsp;In Objective-C all dispatching is name-based, and hence a method with the same selector in a child class will always override a parent method with the same name (unlike in Object Pascal, it is not possible to hide an inherited method, nor to start a new inheritance tree).</p><p>&nbsp;&nbsp;Objective-Pascal however also requires ''override'' to be specified when overriding inherited Objective-C methods for consistency with Object Pascal. If ''override'' is absent, the compiler will give an error. This can also help catch bugs, as explained in [http://lists.apple.com/archives/Xcode-users/2009/Aug/msg00251.html this thread]. There is one exception though: for ''external'' classes, ''override'' is not required because such declarations are often produced using automated parsers, and requiring them to add ''override'' in the right places could needlessly complicate them. Not adding ''override'' in such situations will however still cause the compiler to show a hint.</p>
 
* '''What to do''': Always add ''override;'' at the end of method declarations that override inherited methods.
 
* '''What to do''': Always add ''override;'' at the end of method declarations that override inherited methods.

Revision as of 17:56, 30 August 2009

Introduction

FPC's "Objective-Pascal" (ObjCPas) dialect was introduced to enable seamless interfacing with Objective-C code, in particular on Mac OS X. Due to inherent differences between the C and Pascal philosophies, this language mode will have some seemingly strange behaviour regardless of whether your main background is in Objective-C or in Object-Pascal.

This page describes the conceptual differences between ObjCPas and on the one hand Objective-C, and on the other hand Object Pascal.

Differences with Object Pascal

No constructors

No destructors

No unique root class

  • Description: In Object Pascal, if you do not specify a parent class, a newly defined class will automatically inherit from TObject. While in NeXTStep/Apple/GNUStep's Objective-C frameworks NSObject fulfills a similar role, there are also other root classes (such as NSProxy). Since there is no unique root class in the Objective-C language, this means that if you do not specify a parent class, you will define a new root class.
  • What to do: Generally, you will want new classes to inherit from NSObject if they do not have to inherit from any other class.

Differences with Objective-C

Marking methods as override

  • Description: In Object Pascal, if you want to override an inherited method then you have to add the override keyword to the declaration in the child class. Without override, the inherited method will be hidden in the syntactic scope of the child class, but when casting the child class to the parent type and call that method, the parent's implementation will still be executed.

      In Objective-C all dispatching is name-based, and hence a method with the same selector in a child class will always override a parent method with the same name (unlike in Object Pascal, it is not possible to hide an inherited method, nor to start a new inheritance tree).

      Objective-Pascal however also requires override to be specified when overriding inherited Objective-C methods for consistency with Object Pascal. If override is absent, the compiler will give an error. This can also help catch bugs, as explained in this thread. There is one exception though: for external classes, override is not required because such declarations are often produced using automated parsers, and requiring them to add override in the right places could needlessly complicate them. Not adding override in such situations will however still cause the compiler to show a hint.

  • What to do: Always add override; at the end of method declarations that override inherited methods.