Objective-C — Subclass of delegate in subclass-Collection of common programming errors
This is a fairly complicated inheritance hierarchy, so bear with me (I’ve tried to simplify things rather than state the exact case I am using which is even more complex):-
Let’s say I create a subclass of UITextField called TextField which is my own custom enhanced general-purpose textfield. Now, in order to provide this enhanced functionality, in the init method of TextField, I set super.delegate = self so that all the delegate methods from UITextField are sent to TextField. TextField implements the UITextFieldDelegate protocol and receives those delegate methods to do something interesting.
However, in turn, I want to make it so that TextField has it’s own delegate. So I create a new protocol called TextFieldDelegate (note the lack of UI-prefix!) and give TextField an ivar id __weak delegate with corresponding property so that other classes can receive delegate methods from TextField.
I hope you’re still with me, because I haven’t done anything too complex so far. But let’s say that now, I create another custom subclass of TextField, let’s call it PasswordTextField (in real life, one probably wouldn’t need to create a subclass just to implement a password functionality, but let’s assume that there is some fairly sophisticated implementation that would require this).
Let’s also assume that I want to make it so that PasswordTextField (which like TextField has a delegate property) is able to send an enhanced set of delegate methods. For example, maybe it can send a method passwordIsSecure which is sent once a password has reached a required level of complexity. Now since this behaviour that wouldn’t be found in the regular TextField, I create a new protocol: PasswordTextFieldDelegate which defines the new delegate methods for PasswordTextField and inherits all of the delegate methods sent by TextField.
The problem is: how do I do implement this in PasswordTextField? Things that don’t work:
Inheritance
I cannot simply inherit the delegate from TextField, because TextField‘s delegate conforms only to TextFieldDelegate and not PasswordTextFieldDelegate, so I can’t send methods like [delegate passwordIsSecure] because TextFieldDelegate has no such method.
Overriding ivar
I could try declaring an ivar in PasswordTextField called delegate, but the compiler complains that this is a duplicate declaration, because of course there is already an ivar called delegate in the superclass, so this doesn’t work either*.
Modifying the superclass
I could go back to the TextField class and redefine the delegate to implement both TextFieldDelegate and PasswordTextFieldDelegate, but this seems messy and tells TextField that it can send PasswordTextFieldDelegate methods, which of course, it can’t!
I haven’t tried this one, simply because it seems to break every sensible coding rule in the book.
In summary, there must be some way of doing this such that a subclass of a class can have it’s own delegate that’s a sub-delegate of the superclass’s delegate and for all of this to fit together nicely, but I just can’t figure it out! Any ideas?
(* As a side issue, I don’t understand why the compiler complains when PasswordTextField declares a “duplicate” ivar named delegate, but doesn’t complain when TextField declares an ivar named delegate which is presumably a duplicate of UITextField‘s property called delegate!)