それはおそらく歴史的です。 Objective-Cは厳密な型指定をサポートしていますが、オブジェクトがクラスを気にせずに応答するメッセージを気にする「ダックタイピング」もサポートしていますすなわち、それがアヒルのように見え、それがアヒルのように突っ込むと、それはおそらくアヒルです)。すべてのオブジェクトポインタを id
として入力して、どんなメッセージでも送ることができます。実際、受信者は受信するすべてのメッセージのメソッドを実装する必要はありません。メッセージを別のオブジェクトに転送することもできます。
OpenStepとCocoaの前身のGUIフレームワークであるApplication Kitでは、ほとんどすべてのオブジェクトがダックタイピングによって使用されていました。アプリケーションキットのバージョン3.2の Window
の(部分的な)インターフェースです。
@interface Window : Responder
{
NXRect frame;
id contentView;
id delegate;
id firstResponder;
id lastLeftHit;
id lastRightHit;
id counterpart;
id fieldEditor;
int winEventMask;
int windowNum;
float backgroundGray;
//some bit masks indicating whether the window is visible, is key etc.
}
-contentView;
-setContentView:aView;
//more methods
@end
contentView
ivarは id
であると定義され、アクセサメソッド内のすべての型は暗黙的に id
として定義されています -setContentView:
はオブジェクトを返します。おそらく Window
インスタンス self
)。これが1990年代初めのObjective-Cコードの大半を示しています:アプリケーションキットはおそらく1990年代初めのObjective-Cコードの でした。
NSWindow
was introduced in the first version of AppKit - the GUI framework in what became Cocoa, back in 1994. AppKit generally uses more strict type declarations than Application Kit did, but it's not rigidly observed. Indeed it may even be the case that AppKit's NSWindow
contains code from Application Kit's Window
, and that this contentView
ivar was not updated in the change.
実際、Objective-C変数の型適合の厳格な要件は比較的最近のものです。厳密性の大部分は、プロパティ宣言(Cが存在し、キャストをサポートすることを除いて厳密に型指定されている)、またはオプションのメソッドを許可するプロトコルへの変更によって導入され、委譲オブジェクトを厳密に型指定することができます。