views:

86

answers:

1

Hey all,

I've run into an Objective-C problem that doesn't seem to make any sense to me. I am a relatively well-versed ObjC programmer and understand the whole "forward declaration" concept, but this one has me scratching my head. So here's the deal:

ClassA is a class in my Xcode project that is project-only. ClassB is a subclass of ClassA which is public and is imported into my framework's header.

I am getting a "Cannot find interface declaration for 'ClassA', superclass of 'ClassB'..." error when building. I have already put the @class ClassA; forward declaration in ClassB.h, but that does not seem to solve the problem. When I change the @class ClassA; to #import ClassA.h, it works fine. However, since ClassA is project-only, dependent projects cannot build ClassB because it cannot access ClassA's source.

Any help would be appreciated and I hope that makes sense. Thanks!

+3  A: 

To subclass a class, the superclass's full declaration must be available to the compiler. @class just enables references to instances of said class -- allows for A *foo;.

Subclassing requires more metadata (at least, it did under the legacy runtime -- I think it might be possible to support subclassing without the full super's @interface. Technically possible, but probably not useful.)

bbum
Hmm, I figured as much. However, that makes me unsure what to do here. I suppose the only route I have left is to make the superclass public and simply document that using the superclass is not advised.
Grimless
Ah, yes. An abstract superclass. I'd suggest you read about Class Clusters because they perpetuate a similar design pattern.
bbum
Unfortunately, I don't believe class clusters address this issue. Class clusters hide subclasses that provide specific functionality. I am trying to hide the *superclass* while still making the subclasses publicly available. In any case, thanks for the insight!
Grimless
Well... you can always implement key methods in the abstract super and `@throw` an exception when called. "Subclass responsibility" is the name of the pattern and I described it here: http://www.friday.com/bbum/2009/11/21/calling-python-from-objective-c/
bbum