Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Objective C protocol as an equal to Java Interface?

The question is not only regarding the headline, but more of a "how will I achieve this, without trying to force a Java/Flash design into an Objective C (iPhone)program".

I have 6 views that extends UIView, these views all have different behavior but share certain methods, like -(void) update and -(void) changeState:(NSInteger)state.

A viewController, whose job is it to update, instantiate and display these views has a switch block to do this. So switch(4) {...} instantiates UIView4, but as I need a reference to the currently instantiated view (to do update and changeState:), I have a UIView property on my ViewController called self.currentView. As the instantiated UIView4 extends UIView I can easily go [self.currentView addSubview:UIView4instance] and then release the UIView4instance.

Now how will I call the [UIView4instance update] method on the view? or the [UIView5instance changeState] etc. etc. Since I added it to self.currentView which is of type UIView it no longer has any reason to believe it has an update or changeState: method, meaning I cannot iterate the views and send them these messages.

This approach brings on a ton of other problems, I would need to test and typeCast my views each time I needed to do any operations on them.

If I were doing something like this Composite Pattern approach in, say, Java. I would either write an interface that all the views (UIView1, UIview2.... UIViewN) would implement. Or maybe an abstract class that all the views inherited the changeState: and update methods from.

This way I could have self.currentView just know that I'm adding objects to your view and they all conform to these methods.

The two solutions I can think of, with my very small Objective-C experience is: doing it with delegation or categories, but this seems overkill in every way :/ I guess I could also extend UIView and then extend my class extending UIView again, but there is probably a reason Objective-C does not directly support abstract classes...

Hope someone could point me in the right direction regarding these issues. Thanks:)

like image 811
RickiG Avatar asked Dec 17 '22 03:12

RickiG


1 Answers

Yes it is equal. You can declare a protocol

@protocol MyViewProtocol
-(void)update;
-(void)changeState:(NSInteger)state;
@end

and declare your subclasses like

@interface MyUIView3 : UIView<MyViewProtocol> {
....
}
....
@end

Then, the declaration

UIView<MyViewProtocol>* view=[[MyUIView3 alloc] init];

means that view is an instance (of a subclass of) UIView which also conforms to MyViewProtocol. Just the way it works in Java, I think. See the apple doc on protocols.

like image 146
Yuji Avatar answered Dec 27 '22 23:12

Yuji