Skip to main content

How to copy superclass properties to a subclass?



Let's say I have two Classes like so:







Car

{

NSInteger wheels;

NSInteger bumpers;

}



+ (Car *)carWithData:(NSDictionary *)carData;





Lexus : Car

{

GPS *navigation;

}



+ (Lexus *)carWithData:(NSDictionary *)carData;







carWithData: is a simple helper method that creates an instance of Car populated with variables from carData . Lexus' version would also set the navigation data.





How would Lexus' carWithData look like without duplicating code from Car ?


Comments

  1. This is accomplished by calling super's implementation of init… in the init method:

    //Car.m:
    - (id)initWithData:(NSDictionary *)carData {
    self = [super init];
    if (self) {
    //setup generic car properties:
    self.wheels = [carData objectForKey:@"wheels"]; //example
    self.bumpers = [carData objectForKey:@"bumpers"]; //example
    }
    return self;
    }

    + (id)carWithData:(NSDictionary *)carData {
    return [[[self alloc] initWithData:carData] autorelease];
    }


    //Lexus.m:
    - (id)initWithData:(NSDictionary *)carData {
    //this call to super is where the car's generic properties get initialized:
    self = [super initWithWithData:carData];
    if (self) {
    //setup lexus car properties:
    self.navigation = [carData objectForKey:@"navigation"]; //example
    }
    return self;
    }

    //there is no need to override super's [carWithData:] method as it's only a wrapper anyway.


    Also note that both the initWith… and carWith… methods return id, not Car or Lexus.
    The way your code is set up you end up with casting problems, where [Lexus carWithData:dataDict] does return an object of class Lexus, but the compiler doesn't know about it, as it expects a Car.

    ReplyDelete
  2. You would not define the methods with different signatures like:

    + (Car *)carWithData:(NSDictionary *)carData;
    + (Lexus *)carWithData:(NSDictionary *)carData;


    you should instead use

    + (id)carWithData:(NSDictionary *)carData;


    The implementation of the subclass would then look like

    - (id)initWithData:(NSDictionary *)carData;
    {
    self = [super initWithData:carData];
    if (self) {
    _navigation = [carData valueForKey:@"navigation"];
    }
    return self;
    }

    + (id)carWithData:(NSDictionary *)carData;
    {
    return [[[self alloc] initWithCarData:carData] autorelease];
    }

    ReplyDelete
  3. Here would be my solution:

    // interface
    -(id) initWithCarData:(NSDictionary *) carData;
    +(Car *) carWithCarData:(NSDictionary *) carData;

    // car implementation
    -(id) initWithCarData:(NSDictionary *) carData
    {
    if (self = [super init])
    {
    // initialize car data
    }

    return self;
    }

    +(Car *) carWithCarData:(NSDictionary *) carData
    {
    // note that 'self' here is the current class,
    // there is no need to overwrite this method in the subclass
    return [[self alloc] initWithCarData:carData];
    }

    // lexus implementation
    -(id) initWithCarData:(NSDictionary *) carData
    {
    // initialize the variables that the superclass recognizes
    if (self = [super initWithCarData:carData])
    {
    // initialize the lexus data
    }

    return self;
    }


    So, when you call [Lexus carWithCarData:myData] it ends up calling the Lexus's init method, not the Car's.

    ReplyDelete

Post a Comment

Popular posts from this blog

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex