C 中便利初始化方法和指定初始化方法

初始化 之 便利初始化和指定初始化便利初始化方式便利初始化方式一-(id) initWithFormat:(NSString *) format,…; 初始化了一个新的字符串作为格式化操作的结果. 下面就是一个小例子//按格式返回字符串NSString *myString = [[NSString alloc] initWithFormat:@”myString has %dletter”,8];NSLog(@”%@”,myString);

其结果是打印出一句话: myString has 8 letter

便利初始化方式二* **)error

下面是一个利用打开文件并且读取文件内容初始化的例子:

NSError *error = nil; NSString *fileContent = [NSString stringWithContentsOfFile:@”/Users/qingyun/ Desktop/anotherTest.txt” encoding:NSUTF8StringEncoding error:&error];NSString *fileContent = [[NSString alloc] initWithContentsOfFile:@”/Users/ qingyun/Desktop/anotherTest.txt” encoding:NSUTF8StringEncoding error:&error];// error 是指针的指针 if (nil != error) {NSLog(@”%@”,error);exit(1); }NSLog(@”File content:%@”,fileContent);指定初始化方式便利构造函数的缺点

在子类化的时候,为了保证父类能正常初始化,就需要重写父类所有的初始化方法和便利初始化方法,并添加子类成员变量的初始,,这样就会导致,当父类修改或者添加初始化方法的时候,子类需要做相应的修改。这样的设计偏离了高内聚低耦合的设计原则。

指定初始化函数

类中的某个初始化方法被指派为指定初始化函数,该类的所有初始化方法都使用指定初始化方法执行初始化操作.而子类使用其超类的指定初始化方法进行超类的初始化. 一般情况下,接收参数最多的初始化方法是最终的指定初始化方法,因为它的初始化信息比较全面.因此,对于子类来说,只要重写父类的指定初始化方法,就可以解决便利初始化方法的缺点.

下面举一个例子,构建一个 QYTire 的类,它有两个成员变量,压力和花纹,还有一些对应的方法,在其对应的头文件(. h) 中,代码如下:

: pressure;@property float treadth;- (id)initWithPressure:(float)pressure;- (id)initWithTreadth:(float)treadth;- (id)initWithPressure:(float)pressure andTreadth:(float)treadth;@end

在实现文件中,代码如下:

– (id)init{self = [self initWithPressure:30.5f andTreadth:20.6f];if (self) {}return self;}- (id)initWithPressure:(float)p{self = [self initWithPressure:p andTreadth:20.6f];if (self) {}return self;}- (id)initWithTreadth:(float)t{self = [self initWithPressure:30.5f andTreadth:t];if (self) {}return self;}//指定初始化方法- (id)initWithPressure:(float)p andTreadth:(float)t{self = [super init];if (self) {self.pressure= p;_treadth = t;}return self;}

新建一个子类 AllWeatherTire,继承于 QYTire,由于它继承了超类中的方法,当其在子类中要使用这些方法时,要重写这些方法.如果使用指定初始化方法时,当父类方法出现变动时,只需要重写子类中的指定初始化方法即可.

: rainHanding;@property float snowHanding;- (id)initWithRainHanding:(float)rainHanding;- (id)initWithSnowHanding:(float)snowHanding;@implementation AllWeatherTire- (id)initWithPressure:(float)p andTreadth:(float)t{self = [super initWithPressure:p andTreadth:t];if (self) {self.snowHanding = 300.2f;self.rainHanding = 200.3f;}return self;}- (id)initWithSnowHanding:(float)s{self = [self initWithSnowHanding:s andRainHanding:200.3f];if (self) {}return self;}- (id)initWithRainHanding:(float)r{self = [self initWithSnowHanding:300.2f andRainHanding:r ];if (self) {}return self;}// 子类的也可以使用指定初始化方式- (id)initWithSnowHanding:(float)s andRainHanding:(float)r{self = [super init];if (self) {self.snowHanding = s;self.rainHanding = r;}return self;}- (NSString *)description{];}@end

天才是百分之一的灵感加上百分之久十久的努力

C 中便利初始化方法和指定初始化方法

相关文章:

你感兴趣的文章:

标签云: