Also hier ist mal ein kurzes Beispiel, wie ich das mit dem Pimpl gemeint habe, vielleicht ist dann klarer, dass es vorteilhaft sein kann.
Alles anzeigen
Geht bestimmt noch eleganter, ist ja aber auch nur zu illustrationszwecken.
C-Quellcode
- /* vim: set ft=objc */
- #include <Cocoa/Cocoa.h>
- /************************* Versteckter Teil **/
- @interface Foo_intern : NSObject {
- }
- - (int) secret;
- - (int) number;
- @end
- @implementation Foo_intern
- /* "secret" ist eine echt private Methode, die
- * von aussen nicht verwendbar sein soll */
- - (int) secret {
- return 222;
- }
- /* "number" ist eine oeffentliche methode */
- - (int) number {
- return [self secret]*3;
- }
- @end
- /************************* Oeffentlicher Teil **/
- /* Im oeffentlichen header is kein hinweis
- * auf Foo_intern noetig! */
- @interface Foo : NSObject {
- @private
- id p_;
- }
- - (id) init;
- @end
- /* in der implementierung kann man einen
- * header von Foo_intern einbinden, das hier
- * bekommt ja auch niemand zu sehen */
- @implementation Foo
- - (id) init {
- self = [super init];
- if(self) {
- /* interne instanz anlegen */
- p_ = [[Foo_intern alloc] init];
- }
- return self;
- }
- /* oeffentliche methoden reichen einfach
- * nur weiter */
- - (int) number {
- return [p_ number];
- }
- /* "private" methoden fehlen! */
- @end
- /************************* Benutzung **/
- int main(int argc, char* argv[]) {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- Foo *f = [[Foo alloc] init];
- NSLog(@"%d\n", [f number]); ///< Wunderbar
- NSLog(@"%d\n", [f secret]); ///< Funktioniert nicht, crash!
- [pool drain];
- return 0;
- }
Geht bestimmt noch eleganter, ist ja aber auch nur zu illustrationszwecken.
♥C++