OCクラスの継承およびクラスのループ呼び出し


一、
OCのインスタンス変数の可視性について、インスタンス変数へのアクセス権は3つあります.
1),@public共有
@publicで修飾されたインスタンス変数は共通です.すなわち、アクセス権がなく、どのファイルにもアクセスできます(アクセスはオブジェクト+オペレータを指します).
 
 
2),@protectedが保護されている
@protectedで修飾されたインスタンス変数には一定のアクセス制限があり、本クラスファイルおよびサブクラスファイルへのアクセスのみが許可され、他のファイルはアクセスできません.
 
 
3),@privateプライベート
@privateで修飾するインスタンス変数は、本クラスのファイルにのみアクセスでき、サブクラスのファイルや他のファイルにはアクセスできません.
ここでは私有的な方法と言える.私有の方法はない.hファイルに宣言する間に.mファイルで実装される方法は、本クラスの呼び出しのみが許可され、外部からアクセスできず、サブクラスでもアクセスできません.
二、
我々は通常、インスタンス変数を定義する際に変数のアクセス権限を宣言しないが、OCのデフォルトは@protectedである.OCはオブジェクト向けの3つの特性:パッケージ、継承、マルチステートであるからである.public外部として宣言するとアクセスおよび修正が内部の1つの実装に影響し、実装の詳細が漏れ、OCのオブジェクト向けのパッケージング特性を体現することができない(パッケージングの思想は内部を隠す実装である).privateと宣言すると、子クラスファイルはインスタンス変数にアクセスできません.このようなクラスファイルは、OCのオブジェクト向けの継承特性に反する宣言を再定義する必要があります(継承とは、親クラスのすべてのインスタンス変数やメソッドなどの子クラスがアクセスできることを意味します.
 
protectedとして定義され、変数の再割り当てが必要な場合は、setterメソッド、すなわちsetterメソッドを使用してインスタンス変数ごとにメソッドを設定し、アクセス、すなわちgetterメソッドを使用してインスタンス変数ごとにメソッドを設定して値を取得できます.
例えば、個人という類の例を挙げるとPersonという
インスタンス変数は次のとおりです.
{
   
    NSString *_name;//名前
    NSString *_sex;//性別
    NSInteger _age;//年齢
}
 
1,セットアップ,getterメソッド
1)は_name代入
- (void)setName:(NSString*)name;
 
2)は_sex賦課
- (void)setSex:(NSString*)sex;
 
3)は_age賦課
-(void)setAge:(NSInteger)age;
 
2,アクセサgetterメソッド
1)リード_nameの値
- (NSString *)name;
 
2)リード_sexの値
- (NSString *)sex;
 
3)リード_ageの値
- (NSInteger)age;
 
三、
クラスの継承
1.複数のクラスで部分的に同一のインスタンス変数とメソッドが出現する場合は継承を考慮し、継承時に複数のクラスで同一のインスタンス変数のメソッドを共通の親クラスとして提案する.
子クラス継承親:親クラスに@privateとして宣言するインスタンス変数およびプライベートメソッドを除くすべてのコンテンツが継承されます.子クラスに親と同じコンテンツがある場合は、すべて削除できます.
私有方法:不在.hファイルでは,mファイルでのみこのメソッドが実装され,プライベートメソッドでは外部アクセスが許可されず,本クラスにアクセスを呼び出すしかないと宣言する.
 
あるクラスが別のクラスを継承するときは.hファイルの@interfaceの先頭に親を書きます:番号の後ろに、学生クラスStudentがPersonクラスを継承しています.
@interface Student:Person
 
2.継承時のメソッドは3つあります.
1)親のメソッドの実装を保持する(実装メソッドは書き換えない)
2)は,サブクラス書き換え後の方式で実現する(実装方式書き換え方法,自分の実装体を書いて親の実装を完全に無視する)
3),この方法には親の方法もあれば子の方法もあるが,この場合,我々は一般的に方法の実現内容において親の方法を呼び出す実現を「super(方法)」という方法名で継承した方法名であるが,その後に子の特有の行為を実現する
3,ここではクラス継承時のカスタム初期化の実現方法に重点を置く必要がある.
まず、カスタム初期化のメソッド名はinit+Whithで始まる必要があります.戻り値は(id)、はい-」のメソッドです.
サブクラスに固有のインスタンス変数がある場合は、次のようになります.
 
{
    NSString *_num;
    NSString *_course;
}
 
1つの学号と課程を多くして、初期化の時にサブクラスは自分の独特なインスタンス変数に対してだけ値を割り当てることができて、superは親クラスの初期化方法に対する実現を呼び出して、親クラスから受け継いだインスタンス変数に値を割り当てるために、ここのselfはやはりメソッドを呼び出す時の値は自分に返して、誰が使って誰に返して、もし値を与えるのが成功しないならばself==nil、この時サブクラスは値を与えていません親のインスタンス変数の割り当てに失敗すると、子の割り当ては意味がありません.
-(id)initWithname:(NSString*)name sex:(NSString *)sex age:(NSInteger)age num:(NSString *)numcourse:(NSString *)course
{
   self = [super initWithname:name sex:sexage:age];
      if(self != nil) {
         _course= course;
         _num= num;
      }
   
    return self;
}
 
四、便利な構造器
main関数でオブジェクトを作成してメッセージを受信する場合、オブジェクトを作成するときにオブジェクトに空間を開いたり初期化したりする必要があります.これは面倒です.クラスを定義するときにオブジェクトのために空間を開くことを直接実現します.つまり、コンストラクタです.
役割:オブジェクトをすばやく作成し、内部にオブジェクトを作成するプロセスをカプセル化します.
書式:1.+番号の方法、
2,戻り値idタイプ,
3、クラス名+Withで始まり、複数のパラメータをつなぎ合わせる
また、上述の学生クラスStudentクラスが人間Personを継承することを例に挙げる.
1)は.hファイルに方法の声明を書いて、
ここでこのメソッドは「+」のメソッドです.
+ (id)studentWithname:(NSString *)name sex:(NSString*)sex age:(NSInteger)age num:(NSString *)num course:(NSString *)course;
2)は.mファイルに書く方法の実現
+ (id)studentWithname:(NSString *)name sex:(NSString*)sex age:(NSInteger)age num:(NSString *)num course:(NSString *)course
{
    return [[Studentalloc] initWithname:name sex:sex age:age num:num course:course];
}
 
 
 
 
五、
クラスのループ呼び出しに関する問題
この問題は一般的に1つのクラスインスタンス変数に別のクラスを使用する必要があるすべての変数を解決するために使用されます.
例えば、1つのファミリークラス、メンバーにはお父さん、お母さん、息子がいて、この3つのクラスはそれぞれ別のクラスの内容を確立する必要があります.例えば、お父さんクラスのインスタンス変数には名前年齢、妻、息子があります.ここで妻と息子のタイプは妻クラスと息子クラスのクラス名+*であり、この場合はループ呼び出しを行い、ループ呼び出しに遭遇した場合にファイルをインポートする必要があるが、ここでのインポートファイルは直接そのクラスにあることはできない.hファイル用"#import"ヘッダファイル"はファイルをインポートするが、このクラスはまだ定義されていないため認識できず、このクラスを再使用する際にクラスとして扱うことができないため、このクラスの.hファイルでは「@class+呼び出すクラス名」を使用して、呼び出すクラスを文字列として宣言しますが、クラスの内容が備わっていないので、そのクラスの.mファイルに"#import"ヘッダファイル"でヘッダファイルをインポートする.次に家族の例を挙げます
 
1)男性
(.hファイル)
@class Woman;
#import "Child.h"
@interface Man : NSObject
 
{
    NSString*_name;//名前
    NSString*_sex;//性別
    NSInteger_age;//年齢
    Woman*_wife;//妻
}
//妻の設定
- (void)setWife:(Woman *)wife;
 
//子どもの設定
- (void)setChild:(Child *)baby;
//訪問名
- (NSString *)name;
//為_sex賦課
- (void)setSex:(NSString *)sex;
 
//為_age賦課
- (void)setAge:(NSInteger)age;
 
- (id)initWithName:(NSString *)name Sex:(NSString*)sex Age:(NSInteger)age;
//一人の情報を出力する
- (void)print;
@end
 
 
(.mファイル内)
 
#import "Man.h"
#import "Woman.h"
@implementation Man
 
- (void)setWife:(Woman *)wife
{
    _wife =wife;
}
 
- (void)setChild:(Child *)baby
{
    _baby =baby;
}
 
//訪問名
- (NSString *)name
{
    return_name;
}
 
//sexに値を付ける
- (void)setSex:(NSString *)sex
{
    _sex =sex;
}
//ageに値を付ける
- (void)setAge:(NSInteger)age
{
    _age =age;
}
 
- (id)initWithName:(NSString *)name Sex:(NSString*)sex Age:(NSInteger)age
{
    _name =name;
    _sex =sex;
    _age =age;
    returnself;  }
 
-(void)print
{
   NSLog(@"I am a man,My name is %@,My wife's name is %@, My baby'sname is %@",_name,[_wife name],[_baby name]);
}
 
その中で女類と子供類は男類に似ているが,呼び出された類が異なるだけで,ここでは余計なことは言わない