• 検索結果がありません。

ヒント

目 的 オ ブ ジ ェ ク ト 指 向 プ ロ グ ラ ミ ン グ の 理 解 2.1

クラスの基本を理解する

シナリオ: Tailspin Toys 社は、小さな子供向けにシンプルな犬型ロボットを開発しています。このロボット犬は USB ケーブルでコンピューターに接続され、子供たちはシンプルなアプリケーションを使用して、好みに応じ てこの玩具をパーソナライズすることができます。ハードウェアはほぼ完成しましたが、持ち主が犬型ロボッ トのカスタマイズに使用するソフトウェアの開発はまだです。Viktor は、このソフトウェアの開発を担当する ために採用されました。

Viktor はまず、ロボット犬を表すクラスを設計する必要があります。もちろん、クラスの名前は Dog としま す。このロボット犬、すなわち Dog クラスでは、犬の名前、年齢、性別を記録する必要があります。また、

吠える、歩く、尻尾を振る、および座るという動作も必要です。

Viktor が作成した C# コードは、現時点で次のような状態です。

public class Dog { public Dog() {

name = "Hugo";

age = 1;

gender = 'M';

} }

1.

次のうち、Dog クラスに含まれているプ ロパティはどれですか。

a. bark b. name c. Dog()

2.

別の名前、年齢、または性別で Dog を 作成するために、Viktor が追加する必 要があるものは、次のどれですか。

a. 別のコンストラクター b. 別のプロパティ c. 作成イベント

3.

新しい Dog を正しく作成できる C#

のコード行は、次のどれですか。

a. Dog hugo = Dog.new();

b. Dog hugo = new Dog();

c. new Dog hugo = Dog();

多くの場合、

クラスには複数の コンストラクターを 用意します。

クラスの基本を理解する 15

の確認

得点 /3 解答

1.

プロパティは、次のメンバーです。

b. name

2.

別の Dog を作成するために Viktor が追加する必要があるものは、次のとおりです。

a. 別のコンストラクター

3.

Dog を作成する C# コードは、次のとおりです。

b. Dog hugo = new Dog();

重要ポイント

• オブジェクトが現実世界の何かを表すことは、よくあります。このシナリオでは、Dog クラスはロボット 犬を表します。

• オブジェクト指向の設計で、動詞 (吠える、歩く、尻尾を振る、座る) は一般的に、メソッドに相当しま す。属性 (名前、年齢、性別など) は、プロパティまたはフィールドに相当します。

• フィールドは、クラス内で宣言される変数です。プロパティは、フィールド内に格納されたデータにアク セスするシンプルな手段を提供します。

• クラスは、青写真のようなものです。青写真が建築物の特性を定義するように、クラスはそのクラス 内のすべてのオブジェクトが持つプロパティとメソッドを定義します。

• 複数のオブジェクトを 1 つのクラスから作成 (インスタンス化) することができます。これは、多くの 建築物を 1 枚の青写真から建造できることに似ています。

• オブジェクトのインスタンス化 (作成) には、new というキーワードを使用します。

詳 細 情 報

http://msdn.microsoft.com/ja-jp/library/ms173109.aspx

http://msdn.microsoft.com/ja-jp/library/x9afc042.aspx

http://msdn.microsoft.com/ja-jp/library/x9fsa0sw.aspx

16 第 2 章:オブジェクト指向プログラミングの理解

ヒント

目 的 オ ブ ジ ェ ク ト 指 向 プ ロ グ ラ ミ ン グ の 理 解 2.2

継承を理解する

シナリオ: Tailspin Toys 社は犬型ロボット玩具の開発を進めています。初期の市場テストでは、顧客は犬型ロ ボットにもいろいろな犬種がある方がいいと思っていることがわかりました。この結果を受けて同社は、プー ドル、ブルドッグ、ゴールデン レトリーバーという 3 つの種類を製作することに決めました。将来的には別の 犬種を加えることも検討する予定です。多くの属性と動作はすべての犬種に共通しますが、一部の能力は犬種 ごとに異なる可能性があります。

このことは、子どもたちがロボット犬のカスタマイズに使用するソフトウェアを設計している Viktor にとって、

新たな課題となりました。

犬種ごとにすべてのコードを 1 回ずつ作成すると、合計 3 回になりますが、これは避けたいところです。また、

将来このプロジェクトに携わるプログラマが、元の設計と互換性のない新しい犬種を作成することも望ましく ありません。プードルは犬であり (a poodle "is a" dog)、他の犬種も犬なので、Viktor は継承を使うことに決め ました。

1.

Viktor の新しい設計で、Poodle、Bulldog、GoldenRetriever はすべてどのクラスになりますか。

a. 抽象クラス b. 基本クラス c. 派生クラス

2.

それぞれの犬種でコードを再利用し、将来作成される犬種の互換性を確保するには、

Dog クラスを何として宣言しますか。

a. 抽象 b. 派生 c. シール

3.

次のうち、3 つの派生クラスが継承しないものはどれですか。

a. コンストラクター b. プロパティ c. メソッド

基本クラスは

「親」クラスまたは

「スーパークラス」とも 呼ばれます。派生クラス は「子」クラスまたは

「サブクラス」とも呼ば れます。

継承を理解する 17

の確認

得点 /3 解答

1.

この設計では、3 つの犬種のクラスは次のとおりです。

c. 派生クラス

2.

コードを再利用するには、Dog を次の種類のクラスとして宣言します。

a. 抽象。抽象クラスはインスタンス化できません。抽象クラスに実装されているメソッドは、すべての 派生クラスが共有します。

3.

派生クラスが継承しないものは、次のとおりです。

a. コンストラクター

重要ポイント

• 継承を使用すると、他のクラスで定義された動作を再利用、拡張、および変更して新しいクラスを作成で きます。

• 派生クラスは、コンストラクターとデストラクターを除いて、基本クラスのすべてのメンバーを継承し ます。

• 継承が適切かどうか調べるには、「is a」テストを使用します。Viktor の場合、Poodle is a Dog、

Bulldog is a Dog、GoldenRetriever is a Dog です。したがって、継承を使用するのは適切です。しか し、タランチュラは Dog ではありません。したがって、Tailspin 社がもしクモ型ロボットを開発する場合 は、新しい基本クラスが必要です。そうしないと、クモが吠え、尻尾を振ることになります。

• 抽象クラスはインスタンス化できません。言い換えると、Tailspin 社が「犬」という 犬型ロボットを製作することはできないということです。犬型ロボットは、プードル、

ブルドッグ、ゴールデン レトリーバーのいずれかになります。

• インターフェイスは抽象クラスに似ていますが、「Is-a」のガイドラインを守る必要 はありません。Tailspin 社が実際にクモ型ロボットを作成することに決めた場合、

Viktor は犬とクモの両方に実装するインターフェイスを作成することができます。

たとえば、IRobotic のような名前のクラスになるかもしれません。

• C# では、コロンは継承を意味します。次の例を参照してください。

public class Poodle : Dog

詳 細 情 報

http://msdn.microsoft.com/ja-jp/library/ms173149.aspx

http://msdn.microsoft.com/ja-jp/library/ms173150.aspx

18 第 2 章:オブジェクト指向プログラミングの理解

ヒント

目 的 オ ブ ジ ェ ク ト 指 向 プ ロ グ ラ ミ ン グ の 理 解 2.3

ポリモーフィズムを理解する

シナリオ: Tailspin Toys 社での Viktor の作業は順調に進んでいます。Viktor は、ロボット犬をカスタマイズでき るソフトウェアが顧客に受けることを確信しています。Viktor は、基本クラス設計に関する自分のアイデアに 満足しており、エンジニアとマーケティング担当者が変更を加えるのを止めてさえくれれば、細部の設計に着 手したいと思っています。

Viktor は、「吠える」といった一般的な動作はすべての犬に共通する反面、犬種によって鳴き声がかなり異な るということをわかっています。Poodle のために作成する Bark メソッドは、GoldenRetriever に実装す る Bark メソッドと異なっている必要があります。

Viktor は、Dog クラスでいくつかのメソッドを作成しました。以下は、C# で記述されたヘッダーです。

public void Bark() { … } public void WagTail() { … } public void Walk() { … }

1.

派生クラスでこれらのメソッドをオーバーライドできるようにするには、3 つのヘッダーすべてに修飾子 を追加する必要があります。適切な修飾子は、次のどれですか。

a. new b. static c. virtual

2.

派生クラスの中から Dog クラスの Bark メソッドを呼び出す方法として、

適切なものは次のどれですか。

a. Bark() b. Dog.Bark() c. base.Bark()

3.

Bulldog クラスで Dog クラスの Walk メソッドをそのまま使用するには、どう すればよいですか。

a. Dog からコードをコピーして貼り付けることによって、Bulldog に Walk を実装する b. Bulldog に Walk を実装し、Dog の Walk メソッドを呼び出す

c. Bulldog に Walk を実装する必要はない

メソッドをオー バーライドすること により、特定の派生ク ラスを、他の派生クラ スとは異なる実装にす ることができます。

ポリモーフィズムを理解する 19

の確認

得点 /3 解答

1.

3 つのメソッドに追加すべき修飾子は、次のとおりです。

c. virtual

2.

Dog の Bark() メソッドを呼び出す方法として、適切なものは次のとおりです。

c. base.Bark()。基本クラスのメンバーにアクセスするには、base キーワードを使用します。

3.

派生クラスでも基本クラスの Walk メソッドを使用できるようにするには、次のようにします。

c. Bulldog に Walk を実装する必要はない。base.Walk() を呼び出す必要はありません。

派生クラスで継承したメソッドをオーバーライドしていなければ、自動的に基本クラスの メソッドが使用されます。

重要ポイント

• 重要なキーワード:

• base: 派生クラス内から基本クラスのメンバーにアクセスするために使用します。

• virtual: メソッドの実装が派生クラス内でオーバーライドできるようになります。

• sealed: クラスに適用すると、他のクラスがこれを継承することができなくなります。メンバーに 適用すると、他のクラスがこのメンバーをオーバーライドできなくなります。

• new: 修飾子として使用すると、基本クラスのメンバーが隠れます。つまり基本クラスの実装は、

新しいメンバーに置き換わります。注: これは、オブジェクトをインスタンス化するために使用する new 演算子とは異なります。

• override: 継承したメンバーを置き換えるときに必要です。

• 次の C# コードは、Viktor がどのように派生クラスで Dog クラスのメソッドを置き 換えたかを示しています (Dog クラスに質問 1 の解答が適用されているものとします)。

public override void Bark() { … } public override void WagTail() { … } public override void Walk() { … }

詳 細 情 報

http://msdn.microsoft.com/ja-jp/library/ms173152.aspx

http://msdn.microsoft.com/ja-jp/library/ms173153.aspx

20 第 2 章:オブジェクト指向プログラミングの理解

関連したドキュメント