| English | 意味 |
|---|---|
| object/ˈɒbdʒekt/ | オブジェクト |
| encapsulation/ɪnˌkæpsjʊˈleɪʃn/ | カプセル化 |
| class/klæs/ | クラス |
| instance/ˈɪnstəns/ | インスタンス |
| constructor/kənˈstrʌktə/ | コンストラクタ |
| inheritance/ɪnˈherɪtəns/ | 継承 |
| subclass/ˈsʌbklæs/ | サブクラス |
| superclass/ˈsuːpəklæs/ | スーパークラス |
| polymorphism/ˈpɒlɪmɔːfɪzəm/ | 多様性 |
| abstraction/əbˈstrækʃn/ | 抽象化 |
| containment/kənˈteɪnmənt/ | 包含 |
| aggregation/ˌæɡrɪˈɡeɪʃn/ | 集約 |
一处の変更が過去五十箇所の変更を意味していた時代
- プログラムが顧客の残高を公開変数として保持している。二十dirnameが読み取り、十五dirnameが書き込みを行う。今、残高は決して負になってはいけない。
- オブジェクト如果没有場合、そのルールを fifteen箇所に追加する必要があり、誰かが十六番目の書き込みdirnameを追加した日には、再び破綻してしまう。
- オブジェクトの場合、バランスは** private **(非公開)であり、それを変更できる唯一の方法はルールを強制するメソッドです。それを追加する場所は一つだけで、回避する方法はありません。
- それが** カプセル化 であり、オブジェクト指向プログラミングが存在する理由です。このImplementedの授業では、オブジェクト、 クラス **、および4つの柱について学びます。
オブジェクトとクラス
- ** オブジェクト ** は、そのデータである属性と、そのデータに作用する操作であるメソッドを組み合わせます。状態と振る舞いを一体的に扱う単位です。
- ** クラス ** は設計図です。その種類のすべてのオブジェクトが持つべき属性とメソッドを定義します。オブジェクト はクラスのインスタンスであり、独自の値を持ちます。
- 一つの
Taxiクラスがあり、各実際のタクシーはその登録番号と乗車定員を持つ個別のオブジェクトです。

上部に属性、下部にメソッド、そしてそれぞれの可視性が示されています
プログラミング概念ラボ
各例とそれが示すプログラミングの概念を結びつけてください。
オブジェクトが結合するもの:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
オブジェクトは、その上で動作する操作(メソッド)と共にデータ(属性)を束ねます。
クラスとオブジェクトの関係性は何ですか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
One Taxiクラスは属性とメソッドを定義し、実際の各タクシーは独自の乗車定員と登録番号を持つオブジェクトです。
コンストラクタ、ゲッター、セッター
- コンストラクタ は、オブジェクトが作成される際に実行され、属性を有効な初期値に設定するための特別なメソッドです。
- 属性はprivateであるため、クラスは値を読み取るための** get ** メソッドと変更するための** set ** メソッドを提供します。setメソッドで「負にならない」といったルールが強制されます。
- これこそがprivate属性を持つ価値です。データへの他の経路がないため、すべての変更に対してルールが強制されるからです。
CLASS Taxi
PRIVATE Capacity : INTEGER
PUBLIC PROCEDURE NEW(StartCapacity : INTEGER)
Capacity ← StartCapacity
ENDPROCEDURE
PUBLIC FUNCTION GetCapacity() RETURNS INTEGER
RETURN Capacity
ENDFUNCTION
ENDCLASS
コンストラクタとは、以下のことをする特別なメソッドです:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
コンストラクタは、オブジェクト作成時に新しいオブジェクトの属性を初期化します。
柱1:カプセル化
- カプセル化 とは、オブジェクトのデータがメソッドの裏側に隠されていることを意味します。属性はprivateであり、外部コードはpublicメソッドを使用します。
- 二つの特長があり、試験では両方を答える必要があります。オブジェクトはすべての変更において自分のルールを強制でき、また内部表現を後から安全に変更できる点です。なぜなら、外部コードはそれに依存していないからです。
- 今日ポンドで、明日ペニーで残高を保存する場合でも、クラスの利用者はすべて
GetBalance()を呼び出し、外部のコードが破綻することはありません。
カプセル化とは:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
カプセル化はデータを隠し、外部コードは公開メソッドを通じて利用するため、内部実装を安全に変更できます。
カプセル化がもたらす利点として正しいものはどれか。適用されるものをすべて選択してください。
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
カプセル化は保守性と正しさに関わるものであり、速度ではありません。公開されたメソッドを持つ非公開データが、両者を可能にします。
柱2:継承
- 継承 は、サブクラス をスーパークラス を基準として定義することを可能にし、すべての属性とメソッドを引き継ぎ、独自のものを追加するか上書きします。
- 「is-a」関係モデル化します。マネージャーは従業員であるため、
ManagerはEmployeeから継承して部署を追加します。 - 利点は、共通コードをスーパークラス内で一度だけ記述すれば、そこでの修正がすべてのサブクラスに反映される点です。

共有部分は上部にあり、相違点は下部にあります
継承は「is-a」関係(マネージャーは従業員である)をモデル化するため、サブクラスはスーパークラスから継承して拡張します。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
継承は「is-a」の特殊化です。「has-a」関係は、代わりとして合成によってモデル化されます。
継承は「____ a」関係をモデル化します。例えば、マネージャーが従業員である場合です。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
車にはエンジンがあります。これは継承ではなく合成です。この違いを正しく理解できているかが、この問題で試されています。
柱3と4:ポリモルフィズムと抽象化
- ポリモルフィズム とは、異なるオブジェクトが同じメソッド呼び出しに対してそれぞれ独自の反応を示すことです。すべての
ShapeにはArea()メソッドがあります;CircleとRectangleはそれぞれ異なって実装しています。 - その価値:コードは形状のリストをループ処理し、それぞれに
Area()を呼び出しても、それがどのような種類かを知る必要も気にする必要もありません。後からTriangleクラスを追加しても、そのループに変更不能必要です。 - 抽象化 とは、シンプルなインターフェースを示し、その背後にある複雑さを隠すことです。
Area()の呼び出し側は幾何学的任何thingを知る必要はありません。
ポリモルフィズムにより可能になるのは:
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
同じ呼び出し(例: Area())は各タイプに対して正しく動作し、呼び出し側は正確なクラスを知る必要がありません。
定義からメリットまで、ポリモルフィズムの結果を順序立てて並べ替えてください。
難易度 3/5 · 200 コイン + 今日初回完了時に小ボーナス付与
1回の呼び出し、複数の実装、そしてそれらを使用するコードは、新たな実装について知る必要がない。
演習例:柱の名前を答える
- A
BankAccountクラスはバランスをprivateに保ち、Deposit()とWithdraw()メソッドを提供して、負になることを拒否します。 カプセル化: データは隠されており、ルールはデータへの唯一の経路によって強制されます。 - A
SavingsAccountクラスは、追加された利率を持つBankAccountとして定義されています。 継承: is-a関係であり、スーパークラスのコードを再利用しています。 - ループがリスト内のすべてのドキュメントに対して
Print()を呼び出し、各タイプが異なる方法で自身を出力します。 ポリモルフィズム: 一つの呼び出しに対し、複数の実装があります。 - 柱の名前と、それを示すシナリオの特徴を答えてください。
OOPの柱とそれぞれの意味を対応させなさい。
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
カプセル化=隠蔽;継承=is-a特殊化;ポリモルフィズム=同一インターフェース、多様な振る舞い。
演習例:大規模システムにおけるOOP选用の理由
- 大規模システムでオブジェクト指向プログラミングを使用する利点2つを挙げよ。[4]
- カプセル化 により、各クラスの内部実装を変更してもプログラムの他部分に影響を与えないため、システムは保守しやすくなり、チームはクラスを並列に開発できます。
- 継承 により、共通の振る舞いは一度だけ記述され再利用されるため、重複コードが減り、修正が即座に全範囲に適用されます。
- ポリモルフィズム により、新しい种类を追加しても、使用するコードを変更する必要がありません。各回答は特徴およびその帰結を含みます。
チームには選手が含まれますが、チーム自体は選手ではありません
- 包含 (Containment) とは、オブジェクトが他のオブジェクトを属性の一つとして保持することを意味します。集約 (Aggregation) では、保持されたオブジェクトは独立して存在できます: ⟨
Team⟩ は、他のチームに移籍できる可能性のある ⟨Player⟩ オブジェクトへの参照を保持しています。 - 関係性に基づいて選択します:
GoalkeeperはPlayerである(is a) ため、継承を使用します;Teamは 選手を 持つ(has) ため、集約を使用します。チームが選手のKick()メソッドを継承することは設計上の誤りであり、チームがペナルティキックを楽しむことになっても同様です。
チームはPlayerオブジェクトへの参照を保持する。チームが削除されてもPlayerは残る。どの関係が適切か?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
チームは独立したPlayerオブジェクトを含んでいる。継承には「is-a」の関係が必要である。
実演例:プレイヤーをコピーせずにチームを設計する
- 既知:ある
Playerは private な名前とGetName()メソッドを持っています。 DesignTeamとして、private の collectionMembersを含み、Playerオブジェクトへの参照を保持し、参照を追加するAddPlayer(NewPlayer)メソッドを定義してください。 Playerはチームより先に存在でき、チームが削除されてもプレイヤーは残ります。これは集約です。プレイヤー自身のメソッドを通じて名前を変更すると、そのプレイヤーを保持しているすべてのオブジェクトで反映されます。コピーされた文字列则会 become stale(古びた状態)になります。
Player object: name = "Sam"
Team object: Members = [reference to Sam's Player object]
Goalkeeper class: inherits the Player attributes and methods
この設計では、チームを削除する場合、そのチームに含まれるすべてのプレイヤーも同時に破棄される必要があります。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
プレイヤーは独立して存在します。チームを削除しても、それは参照の解除に過ぎず、必ずしもプレイヤーオブジェクト自体を消去するものではありません。
各設計とそれに対応する関係性をそれぞれ結び付けなさい。
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
継承モデルは「is-a」、アグリゲーションモデルは「has-a」であり独立したオブジェクトを持つ;エンカプスレーションはデータへのアクセスを制御する。
見落としやすいポイント
- クラスは設計図 であり、オブジェクトはそのインスタンス です。これらを混同して使用しないでください。
- カプセル化とは、メソッドの裏にデータを隠すことで、その利点はルールの強制と内部の実装を安全に変更できることです。「よりセキュリティが高い」は曖昧すぎるため不適切です。
- 継承とはis-aの関係です。車はエンジンを持っていますが、これは構成(composition)であり、継承ではありません。
- ポリモルフィズム とは、クラスごとに異なる振る舞いをする同じ呼び出しであり、これが既存のコードを変更せずに新しいサブクラスを追加できるようにするものです。
理解できましたか
- オブジェクト は属性とメソッドを組み合わせます;クラス は設計図であり、オブジェクト はインスタンス であり、コンストラクタ によってセットアップされます。
- カプセル化: publicメソッドの裏にprivateデータがあり、すべての変更でルールが強制され、内部実装を安全に変更できる。
- 継承: サブクラス がスーパークラス のメンバーを引き継いで追加または上書きし、is-a をモデル化し、共通コードを一度だけ記述する。
- ポリモルフィズム: 同一の呼び出しがクラス別に行われ、新しい种类を追加しても既存のコードの変更が必要なく;抽象化: 複雑さを隠すシンプルインタフェース