iOSアプリ開発初心者のためのオブジェクト指向の基本iOS SDKで始めるObjective-C入門(6)(3/4 ページ)

» 2014年03月17日 18時00分 公開
[平井祐樹,クラスメソッド]

情報隠ぺい「カプセル化」とは

 次に、記事「オブジェクトに必要な4つの特性とは?」にある「カプセル化」について考えてみましょう。この記事ではカプセル化の例の1つとして、「公開されている「インターフェース」以外にオブジェクトの状態に直接アクセスできない(情報隠ぺい)」とあります。実は、これもすでに実現しています。

カプセル化の例(記事「オブジェクトに必要な4つの特性とは?」より引用)

 例えば、ViewControllerクラスとPersonクラスについて考えてみましょう。ViewControllerからはPersonクラスの属性である_nameや_ageを勝手に変更することはできません。

 _nameを変更するには「- (NSString *)nameメソッド」や「- (void)setName:(NSString *)name」メソッドを介してのみ行えるようになっています。

 また、Person.hとPerson.mを以下のように変更してみましょう。

  1. #import <Foundation/Foundation.h>
  2. @interface Person : NSObject
  3. {
  4. // 性
  5. NSString *_lastName;
  6. // 名
  7. NSString *_firstName;
  8. }
  9. // 性を設定する
  10. - (void)setLastName:(NSString *)lastName;
  11. // 名を設定する
  12. - (void)setFirstName:(NSString *)firstName;
  13. // 名前を取得する
  14. - (NSString *)name;
  15. @end
リスト8 Person.h
  1. #import "Person.h"
  2. @implementation Person
  3. // 性を設定する
  4. - (void)setLastName:(NSString *)lastName
  5. {
  6. _lastName = lastName;
  7. }
  8. // 名を設定する
  9. - (void)setFirstName:(NSString *)firstName
  10. {
  11. _firstName = firstName;
  12. }
  13. // 名前を取得する
  14. - (NSString *)name
  15. {
  16. return [NSString stringWithFormat:@"%@%@", _lastName, _firstName];
  17. }
  18. @end
リスト9 Person.m

 併せてViewController.mを以下のように変更します。

  1. #import "ViewController.h"
  2. // Personクラスをインポートする
  3. #import "Person.h"
  4. @implementation ViewController
  5. - (void)viewDidLoad
  6. {
  7. [super viewDidLoad];
  8. // Personクラスのインスタンスを生成する
  9. Person *yuki = [[Person alloc] init];
  10. // 性を設定する
  11. [yuki setLastName:@"平井"];
  12. // 名を設定する
  13. [yuki setFirstName:@"祐樹"];
  14. // 名前をコンソールに表示する
  15. NSLog(@"こんにちは、私の名前は%@です。", [yuki name]);
  16. }
  17. @end
リスト10 ViewController.m

 これを実行すると、コンソールに以下のように実行されます。

 このとき、性と名の間にスペースを入れたくなったとします。その場合は、Personクラスの「- (NSString *)name」メソッドのみ変更すればよく、ViewControllerに一切手を加える必要はありません。

  1. #import "Person.h"
  2. @implementation Person
  3. // 性を設定する
  4. - (void)setLastName:(NSString *)lastName
  5. {
  6. _lastName = lastName;
  7. }
  8. // 名を設定する
  9. - (void)setFirstName:(NSString *)firstName
  10. {
  11. _firstName = firstName;
  12. }
  13. // 名前を取得する
  14. - (NSString *)name
  15. {
  16. return [NSString stringWithFormat:@"%@ %@", _lastName, _firstName];
  17. }
  18. @end
リスト11 Person.m

 実行結果は以下のようになります。

 このように、Objective-Cでは、カプセル化を実現できることが分かります。

クラスが他のクラスの特性を引き継ぐ「継承」とは

 人間にもたくさんの種類があります。例えば、日本人、アメリカ人などのように国籍別、またはSE、警察官などのように職業別に分類できます。オブジェクト指向では、これらの「関係」を表せます。

 例えば、学生というクラスを考えてみましょう。学生は学校名、学科、学年などさまざまなメンバー変数を持つことが考えられます。これらのメンバー変数はPersonクラスには定義されておりません。しかし、学生も人間です。

 この関係を表すために、オブジェクト指向では「継承」という概念を用います。継承を用いることで、あるクラスが他のクラスの特性を引き継ぐことができます。ですから、学生クラスは人間クラスを継承することで、人間クラスの特性を引き継ぐことができます。

 このとき、人間クラスは「スーパークラス」「抽象クラス」「親クラス」などのように表現します。学生クラスは「サブクラス」「派生クラス」「子クラス」などのように表現します。

 また、このことを「サブクラス化」ともいいます。

「スーパークラス」と「サブクラス」の例(記事「複雑なものを単純に~分類と分解~」より引用)

 それでは、早速学生クラスを作ってみましょう。クラスの名前はStudentとします。作り方はPersonクラスの時と同じです。Personクラス作成時と異なる点は、クラス名を入力する画面で、[Class]に「Student」、[Subclass of]に「Person」を入力します。

 Studentクラスを作成したら、Student.hを開いてみましょう。

  1. #import "Person.h"
  2. @interface Student : Person
  3. @end
リスト12 Student.h

 「@interface Student : Person」とありますが、これが「学生クラスは人間クラスを継承する」ということを意味しています。

 ところで、学生は学校名、学科、学年などさまざまなメンバー変数を持つことが考えられると話しました。ここでは、学校名を定義するメンバー変数を持つこととします。

 Student.hとStudent.mを以下のように変更します。

  1. #import "Person.h"
  2. @interface Student : Person
  3. {
  4. // 学校名
  5. NSString *_school;
  6. }
  7. // 学校名を取得する
  8. - (NSString *)school;
  9. // 学校名を設定する
  10. - (void)setSchool:(NSString *)school;
  11. @end
リスト13 Student.h
  1. #import "Student.h"
  2. @implementation Student
  3. // 学校名を取得する
  4. - (NSString *)school
  5. {
  6. return _school;
  7. }
  8. // 学校名を設定する
  9. - (void)setSchool:(NSString *)school
  10. {
  11. _school = school;
  12. }
  13. @end
リスト14 Student.m

 Studentクラスを変更したら、ViewController.mを以下のように変更します。

  1. #import "ViewController.h"
  2. // Studentクラスをインポートする
  3. #import "Student.h"
  4. @implementation ViewController
  5. - (void)viewDidLoad
  6. {
  7. [super viewDidLoad];
  8. // Personクラスのインスタンスを生成する
  9. Student *yuki = [[Student alloc] init];
  10. // 性を設定する
  11. [yuki setLastName:@"平井"];
  12. // 名を設定する
  13. [yuki setFirstName:@"祐樹"];
  14. // 学校名を設定する
  15. [yuki setSchool:@"アイティメディア学園"];
  16. // 名前と学校名をコンソールに表示する
  17. NSLog(@"こんにちは、私の名前は%@です。%@に所属しています。", [yuki name], [yuki school]);
  18. }
  19. @end
リスト15 ViewController.m

 実行すると、以下のようにコンソールに表示されます。

 このように、StudentクラスはPersonクラスを継承しているため、Studentクラスに定義されていない名前に関するメンバー変数やメソッドを使用できます。

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

Smart & Social 鬮ォ�ェ陋滂ソス�ス�コ闕オ譁溷クキ�ケ譎「�ス�ウ驛「�ァ�ス�ュ驛「譎「�ス�ウ驛「�ァ�ス�ー

髫エ蟷「�ス�ャ髫エ魃会スス�・髫エ蟶キ�」�ッ闖ォ�」

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。