|  | // Matches | 
|  | @interface I1 { | 
|  | int ivar1; | 
|  | } | 
|  | @end | 
|  |  | 
|  | // Matches | 
|  | @interface I2 : I1 { | 
|  | float ivar2; | 
|  | } | 
|  | @end | 
|  |  | 
|  | // Ivar mismatch | 
|  | @interface I3 { | 
|  | int ivar1; | 
|  | int ivar2; | 
|  | } | 
|  | @end | 
|  |  | 
|  | // Superclass mismatch | 
|  | @interface I4 : I2 { | 
|  | } | 
|  | @end | 
|  |  | 
|  | // Methods match | 
|  | @interface I5 | 
|  | - (int)foo; | 
|  | + (float)bar; | 
|  | @end | 
|  |  | 
|  | // Method mismatch | 
|  | @interface I6 | 
|  | - (int)foo; | 
|  | + (int)foo; | 
|  | @end | 
|  |  | 
|  | // Method mismatch | 
|  | @interface I7 | 
|  | - (int)foo; | 
|  | + (int)bar:(int)x; | 
|  | @end | 
|  |  | 
|  | // Method mismatch | 
|  | @interface I8 | 
|  | - (int)foo; | 
|  | + (int)bar:(float)x; | 
|  | @end | 
|  |  | 
|  | // Matching protocol | 
|  | @protocol P0 | 
|  | + (int)foo; | 
|  | - (int)bar:(float)x; | 
|  | @end | 
|  |  | 
|  | // Protocol with mismatching method | 
|  | @protocol P1 | 
|  | + (int)foo; | 
|  | - (int)bar:(float)x; | 
|  | @end | 
|  |  | 
|  | // Interface with protocol | 
|  | @interface I9 <P0> | 
|  | + (int)foo; | 
|  | - (int)bar:(float)x; | 
|  | @end | 
|  |  | 
|  | // Protocol with protocol | 
|  | @protocol P2 <P0> | 
|  | - (float)wibble:(int)a1 second:(int)a2; | 
|  | @end | 
|  |  | 
|  | // Forward-declared interfaces | 
|  | @class I10, I11; | 
|  | @interface I12 | 
|  | @end | 
|  |  | 
|  | // Forward-declared protocols | 
|  | @protocol P3, P5; | 
|  | @protocol P4 | 
|  | - (double)honk:(int)a; | 
|  | @end | 
|  |  | 
|  | // Interface with implementation | 
|  | @interface I13 | 
|  | @end | 
|  |  | 
|  | @implementation I13 | 
|  | @end | 
|  |  | 
|  | @interface I13a | 
|  | @end | 
|  |  | 
|  | @implementation I13a | 
|  | @end | 
|  |  | 
|  | // Implementation by itself | 
|  | @implementation I14 : I12 | 
|  | @end | 
|  |  | 
|  | @implementation I15 : I12 | 
|  | @end | 
|  |  | 
|  |  |