OCベースクラスの3つの特性
9906 ワード
OCベースクラスの3つの特性
OCのクラスはJAVAと同様に3つの特性があります:継承、パッケージ、多態、それではOCの中のクラスの3つの特性を見てみましょう.
1.継承
継承の特徴:
(1)子は親から属性とメソッドを継承する.
(2)サブクラス独自の属性やメソッドは親には使用できない.
(3)サブクラス独自の属性やメソッドは,サブクラス間で相互に使用できない.
(4)子クラスは親クラスのメソッドを書き換えることができ,子クラスがメソッドを呼び出す場合:まず子クラスのメソッドを呼び出し,子クラスにメソッドがなければ親クラスのメソッドを呼び出す.
(5)子オブジェクトポインタは親オブジェクトポインタに変換できますが、親オブジェクトポインタは子オブジェクトポインタに変換できません.
3つの権限変数の継承:
(1)publicとprotected修飾の変数はクラスに継承される.
(2)private修飾の変数はクラスに継承されてはいけない.
(3)継承した属性は,サブクラスで修正する場合は「self.属性名」のみ,「_属性名」は使用できない.
例:
Father類、Father.hファイル:
Father.mファイル:
Son 1クラス、Son 1.hファイル:
Son1.mファイル:
Son 2クラス、Son 2.hファイル:
Son2.mファイル:
main.mで使用:
2.パッケージ
カプセル化:内部実装を非表示にし、外部インタフェースを安定させる.
カプセル化とは、クラスを定義し、プロパティを定義し、メソッドを定義することです.
しかし、クラスはインスタンス変数とメソッドをカプセル化し、プロパティはカプセル化されたsetterとgetterメソッドです.
パッケージがもたらすメリット:より簡単に使用し、変数をより安全にし、内部実装の詳細を隠すことができ、開発速度を十分に向上させることができます.
例:
Studentクラスhファイル:
3.マルチステート
マルチステート(polymorphism):親オブジェクトを1つ以上の子オブジェクトと同等に設定できるテクノロジーです.値を割り当てると、親オブジェクトは現在の子オブジェクトに割り当てられているプロパティに基づいて異なる方法で動作します.つまり、子クラス型のポインタを親タイプのポインタに割り当てることができます.
異なるオブジェクトの同じメッセージに対する異なる応答では、サブクラスは親のメソッドを書き換えることができ、マルチステートはメソッドの再名を許可し、パラメータまたは戻り値は親タイプの入力または戻りであってもよい.
マルチステートの特徴:
(1)親タイプのポインタは、子オブジェクトを指します.
(2)関数メソッドパラメータで親タイプが使用されている場合は、複数の関数を定義して対応するクラスと一致させることなく、親と子オブジェクトに転送できます.
(3)親タイプの変数は,子クラス特有のメソッドを直接呼び出すことはできず,呼び出す必要がある場合は,強制的に子クラス特有のメソッドに変換する必要がある.
例:
Animal類、Animal.hファイル:
Animal.mファイル:
CatはAnimal,Catを継承する.hファイル:
Cat.mファイル:
main.mで使用:
OCのクラスはJAVAと同様に3つの特性があります:継承、パッケージ、多態、それではOCの中のクラスの3つの特性を見てみましょう.
1.継承
継承の特徴:
(1)子は親から属性とメソッドを継承する.
(2)サブクラス独自の属性やメソッドは親には使用できない.
(3)サブクラス独自の属性やメソッドは,サブクラス間で相互に使用できない.
(4)子クラスは親クラスのメソッドを書き換えることができ,子クラスがメソッドを呼び出す場合:まず子クラスのメソッドを呼び出し,子クラスにメソッドがなければ親クラスのメソッドを呼び出す.
(5)子オブジェクトポインタは親オブジェクトポインタに変換できますが、親オブジェクトポインタは子オブジェクトポインタに変換できません.
3つの権限変数の継承:
(1)publicとprotected修飾の変数はクラスに継承される.
(2)private修飾の変数はクラスに継承されてはいけない.
(3)継承した属性は,サブクラスで修正する場合は「self.属性名」のみ,「_属性名」は使用できない.
例:
Father類、Father.hファイル:
#import <Foundation/Foundation.h>
@interface Father : NSObject
@property (nonatomic,strong) NSString *name;
@property (nonatomic) int age;
-(id)initWithName:(NSString *)name andAge:(int)age;
-(void)speakChinese;
-(void)printf;
@end
Father.mファイル:
#import "Father.h"
@implementation Father
-(id)initWithName:(NSString *)name andAge:(int)age
{
self = [super init];
if(self)
{
_name = name;
self.age = age;
}
return self;
}
-(void)speakChinese
{
NSLog(@" ");
}
-(void)printf
{
NSLog(@" %@, %d ",_name,_age);
}
@end
Son 1クラス、Son 1.hファイル:
#import "Father.h"
@interface Son1 : Father
@property (nonatomic) int score;
-(void)speakEnglish;
@end
Son1.mファイル:
#import "Son1.h"
@implementation Son1
-(void)speakEnglish
{
NSLog(@" ");
}
-(void)printf
{
NSLog(@"%@,%d,%d",self.name,self.age,self.score);
}
@end
Son 2クラス、Son 2.hファイル:
#import "Father.h"
@interface Son2 : Father
@property (nonatomic) int money;
-(void)speakFrench;
@end
Son2.mファイル:
#import "Son2.h"
@implementation Son2
-(void)speakFrench
{
NSLog(@" , !");
}
@end
main.mで使用:
#import <Foundation/Foundation.h>
#import "Son1.h"
#import "Father.h"
#import "Son2.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
Father *fa = [[Father alloc] initWithName:@" " andAge:40];
NSLog(@"%@%d",fa.name,fa.age);
[fa speakChinese];
[fa printf];
Son1 *son1 = [[Son1 alloc] initWithName:@" " andAge:20];
NSLog(@"%@%d,%d",son1.name,son1.age,son1.score);
[son1 speakChinese];
[son1 speakEnglish];
[son1 printf];
Son2 *son2 = [[Son2 alloc] initWithName:@" " andAge:22];
[son2 speakChinese];
[son2 speakFrench];
[son2 printf];
Father *fa2 = (Father *)son1;
[fa2 speakChinese];
Son1 *son11 = (Son1 *)fa;
[son11 speakEnglish];
}
return 0;
}
2.パッケージ
カプセル化:内部実装を非表示にし、外部インタフェースを安定させる.
カプセル化とは、クラスを定義し、プロパティを定義し、メソッドを定義することです.
しかし、クラスはインスタンス変数とメソッドをカプセル化し、プロパティはカプセル化されたsetterとgetterメソッドです.
パッケージがもたらすメリット:より簡単に使用し、変数をより安全にし、内部実装の詳細を隠すことができ、開発速度を十分に向上させることができます.
例:
Studentクラスhファイル:
#import <Foundation/Foundation.h>
@interface Student : NSObject
{
NSString *_name;
NSString *_nickName;
}
//@property
//1, +
//2, getter setter
//
//atomic nonatomic
// ,atomic ,nonatomic
// nonatomic
//setter setter
//setter getter
@property (nonatomic,setter = setNickName:,getter = nickName) NSString *nickName;
//
//assign
//strong retain
//readonly : getter, setter
//readwrite : getter setter, readwrite
@property (assign,readonly) int age;
@property (retain,readwrite) NSString *secondName;
-(void)setName:(NSString *)name;
-(NSString *)getName;
-(void)setaaa:(NSString *)aaa;
@end
3.マルチステート
マルチステート(polymorphism):親オブジェクトを1つ以上の子オブジェクトと同等に設定できるテクノロジーです.値を割り当てると、親オブジェクトは現在の子オブジェクトに割り当てられているプロパティに基づいて異なる方法で動作します.つまり、子クラス型のポインタを親タイプのポインタに割り当てることができます.
異なるオブジェクトの同じメッセージに対する異なる応答では、サブクラスは親のメソッドを書き換えることができ、マルチステートはメソッドの再名を許可し、パラメータまたは戻り値は親タイプの入力または戻りであってもよい.
マルチステートの特徴:
(1)親タイプのポインタは、子オブジェクトを指します.
(2)関数メソッドパラメータで親タイプが使用されている場合は、複数の関数を定義して対応するクラスと一致させることなく、親と子オブジェクトに転送できます.
(3)親タイプの変数は,子クラス特有のメソッドを直接呼び出すことはできず,呼び出す必要がある場合は,強制的に子クラス特有のメソッドに変換する必要がある.
例:
Animal類、Animal.hファイル:
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)name;
@end
Animal.mファイル:
#import "Animal.h"
@implementation Animal
- (void)name {
NSLog(@" ");
}
@end
CatはAnimal,Catを継承する.hファイル:
#import "Animal.h"
@interface Cat : Animal
- (void)name;
@end
Cat.mファイル:
#import "Cat.h"
@implementation Cat
//
- (void)name {
NSLog(@" ");
}
@end
main.mで使用:
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Cat.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Animal *animal = [[Animal alloc] init];
[animal name];
Cat *cat1 = [[Cat alloc] init];
[cat1 name];
// :
Animal *cat2= [[Cat alloc] init];
[cat2 name];
}
return 0;
}