ボーナスラウンド
オブジェクト指向プログラミング入門へようこそ!おそらく、「オブジェクト指向プログラミング入門のボーナスラウンドへようこそ!」と言う方が適切でしょう。この記事とそれに続く記事は、オブジェクト指向の基礎についてもう少し学びたい方や、ボーナスコンテンツを楽しんでいる方を対象としています。
復習すると、このシリーズの最初の5つの記事のいくつかを読んだ場合、かなりの数のことを学んだことになります。
- 抽象化がプログラミングタスクの簡素化にどのように役立つか。
- オブジェクト指向のクラス、メソッド、およびプロパティの基本。
- 変数と型の操作とそのデータの操作の基本。
-
for
を使用してフロー制御を処理する方法 およびwhile
ループします。 - これらすべてを組み合わせて簡単なプログラムを作成する方法。
この記事と次の記事では、その紹介から学んだことを取り上げ、オブジェクト指向の原則(多くの場合、オブジェクト指向)を使用して効率的で適切に編成されたコードを作成する方法について詳しく説明します。まず、いくつかの基本的な概念を確認し、コンストラクターなどのいくつかの新しい概念に導くことができる新しいプログラムから始めます。 および継承 。
ここでも、MicrosoftのVisual Studioを使用してC#でプログラミングします。フォローしたい場合(まだ行っていない場合)は、ここでセットアップを見つけることができます。
その記事の設定を「UndertheHood」セクションまで実行すると、私たちが開始する場所にたどり着きます。その記事とは異なる唯一のことは、デフォルトのプロジェクト名「ConsoleApplication1」を使用しないことです。代わりに、サンプルプログラムとしてふれあい動物園を建設するため、プロジェクトを「PettingZoo」(一言で言えば)と呼びます。
注:オブジェクト指向は多くの言語とプラットフォームで利用可能であり、概念は非常に似ています。開始が簡単で、必要なすべてのリソースが無料であるため、C#を選択しました。使用したい他の言語やプラットフォームがあるかもしれませんが、それも問題ありません。私たちは、特に言語や実装ではなく、オブジェクト指向を学ぶためにここにいます。
。
初期設定
始める前に、VisualStudioでコンソールアプリケーションが作成されていることを確認してください。図1のようになります。
図1:PettingZooプログラムの初期設定
Visual Studioで利用可能なこのコンソールアプリケーションを使用して、ファーストクラスの作成を開始できます。 C#では、クラスを作成する方法は複数あります。 Javaなどの一部の言語では、特定のファイル名とフォルダーパターンを使用して特定の方法でクラスを作成する必要がありますが、C#は、何かがクラスであると言っていることを気にします。
デフォルトのコンソールアプリケーションでも、Program
というクラスがすでに1つあることに注意してください。 。キーワードclass
を使用する クラスの名前の後には、C#でクラスを定義する方法が続きます。
このアプローチでは、クラスを保持するための新しいコードファイルを作成します。図2に示すように、[ソリューションエクスプローラー]ペインで[PettingZoo]ノードを右クリックし、[追加]->[クラス]をクリックします。
図2:ソリューションエクスプローラーを使用したクラスの追加
開いたダイアログボックスで、検索またはナビゲートしてCode要素を見つけ、図3に示すように、クラスファイルをAnimals.csなどの名前で呼び出します。
図3:[クラスファイルの追加]ダイアログボックス
これで、次のようなものを含むVisualStudioによって作成された新しいクラスファイルを取得する必要があります。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PettingZoo { class Animals { } }
デフォルトでは、Visual Studioは、選択したファイル名に基づいて、クラスファイルとクラス定義の両方を作成することに注意してください。 Javaなどの一部の言語では、この構造は必須ですが、C#ではそれほど厳密ではありません。クラス名はすぐに変更しますが、とりあえずそのままにしておきます。
Visual Studioが作成したばかりのファイルには、いくつかのusing
があります。 ステートメントとnamespace
コードブロック。これらの行はクラスにとって重要ではありませんが、興味がある場合は、C#の名前空間がプロジェクト内の名前を整理する方法です。たとえば、異なる名前空間で編成された、同じ名前の複数のクラスを持つことができます。
単一の名前空間内で作業する限り、クラスのアドレス指定はかなり簡単です。ただし、プロジェクトをより複雑な部門に編成する必要がある場合は、さまざまな名前空間を利用する必要がある場合があります。その場合は、
using
ステートメントを使用すると、これらの名前空間へのショートカットを作成できます。
。
クラスとオブジェクト
現在のファイルには、選択したファイル名に基づいた名前の事前作成されたクラスが含まれています。 Animals
はありません クラスですが、それを別のものに変更しましょう。ふれあい動物園ではもちろん犬が必要なので、クラスの名前をAnimals
から変更してください。 Dog
へ :
class Dog { }
Animals
からの変更に注意してください (複数形)からDog
(特異な)。後でAnimal
という別のクラスを作成します 、そのようなニュアンスで拾うコードを読むときは注意してください。
クラスにコンテンツを追加する前に、クラスとオブジェクトの違いを調べてみましょう。クラスは、オブジェクトのあり方のテンプレートであることを忘れないでください。単純でそれほど正確ではないアナロジーは、レシピとケーキのアナロジーです。
(このセクションは、上記のリンクされた記事に示されている説明を基にしたクラスとオブジェクトのレビューです。この復習をスキップしてプログラミングに直接進みたい場合は、次のセクションに直接ジャンプしてください。それ以外の場合は、ケーキをお楽しみください!)
レシピはケーキの作り方を教えてくれるので、OO用語ではクラス 。ケーキはレシピの実行の結果であり、これもOOの用語ではオブジェクトです。 。頻繁に使用される別の用語は、インスタンスです。 、ケーキがレシピの実行のインスタンスであることを示します。
ケーキやレシピと同様に、それぞれのケーキはユニークなケーキです。 1つのケーキに対して行うことは、他のケーキには影響しません。 1つのカップケーキにフロスティングをかけることは、すべてのカップケーキにフロスティングがあることを意味するわけではありません。同様に、1つのカップケーキを食べても、他のすべてのカップケーキは残っています。
ただし、レシピを持っていて、それがケーキを作ることを知っているだけでは十分ではありません。ケーキを焼くためのキッチンも必要です。 OO用語では、これはオブジェクトを作成するプログラムであり、この場合は、メインのProgram.csファイルになります。
。
PettingZooに戻る
新しいクラスを使用してDog
を作成しましょう オブジェクトなので、Program.csファイルを開き、static void main
内に次の行を追加します。 コードブロック:
Dog myDog = new Dog();
この行は、新しいDog
を作成します Dog
からのオブジェクト クラスを作成し、 myDogに保存します 変数。この行を3つの部分に分けて、何が起こっているのかを説明しましょう。
[1]Dog [2]myDog = [3]new Dog();
最初の要素[1]、Dog
、は作成する変数のタイプです。 C#やJavaのような静的に型付けされた言語では、変数に値を割り当てる前に、変数の型を宣言する必要があります。 JavaScriptやPerlのように動的に型付けされる言語はこれを必要とせず、変数に含まれるデータの種類を開発者に追跡する責任があります。
2番目の要素[2]、 myDog 、は、オブジェクトにアクセスするために使用する変数名です。これは必ずしも私たちが作成する犬の名前ではなく、Dog
のこの特定のインスタンスを参照するために使用する名前です。 クラス。
注:変数と文字列などのデータ型の詳細については、変数と型に関するプログラミングの記事の概要をご覧ください。
。
最後に、3番目の要素[3]、new Dog()
、作成する、またはインスタンス化する – Dog
に基づく新しいオブジェクト クラス。クラス名の後に括弧があることに注意してください。これは、これが実際にはメソッドであることを意味します。 。このメソッドに戻ります。これは、コンストラクターと呼ばれる特別なメソッドです。 (以下にリンクされている次の記事でコンストラクターについて詳しく説明します)。
プログラムを使用して、Dog
から新しいオブジェクトを作成します。 myDogに格納するクラス 変数の場合、オブジェクトのプロパティとメソッドへのアクセスを開始できます。もちろん、私たちのクラスが完全に空で、コンテンツがないことを除いて!それを修正しましょう。
。
プロパティとメソッド
Dog
があるAnimals.csファイルに戻りましょう。 クラスには名前がありますが、他には何もありません。ただし、このコードブロック内に配置するものはすべて、クラス定義の一部になります。クラスには、オブジェクトとは何か、オブジェクトが何を実行できるかをそれぞれ定義するプロパティとメソッドがあることを忘れないでください。
プロパティとメソッドの両方を作成してから、それぞれが何をするかについて説明します。コードブロックの中括弧内、{}
、次の2行を追加します。
string Name; void Speak() { Console.WriteLine("Woof"); }
最初の行(string Name;
)はプロパティです またはフィールド 。オブジェクト指向では、プロパティは何かが何であるかを定義します。この例では、犬に名前を付けたいので、犬の名前を保持する文字列プロパティを作成しました。
オブジェクト指向は、実際のオブジェクトのプログラムによる表現を作成しようとしていることを忘れないでください。もちろん、名前だけで犬を作ることはできませんが、OOはすべてのオブジェクトのすべてのプロパティを複製しようとはせず、必要なものだけを複製しようとします。後でプロパティを追加します。
2行目はメソッドです 定義(またはメソッドシグネチャ )そしてもう少し複雑なので、前と同じように、少し分割して、各要素が何をするかを示しましょう。
[1]void [2]Speak() [3]{ Console.WriteLine("Woof"); }
要素[1]、void
、は return メソッドのタイプ、またはメソッドが実行されたときに生成される出力のタイプ。 C#やJavaのような静的に型付けされた言語では、変数の型を宣言することに加えて、メソッドから返すデータの種類を常に宣言する必要があります。動的に型付けされた言語は、メソッドから何が出てくるかを決定する責任を開発者に任せます。
私たちの場合、少なくとも最初は、犬に話すように頼んだときに「Woof」と言ってもらいたいので、何も返す必要はありません。これは、後で次の記事で継承について説明するときに変更されます。
ただし、特定の値を返したくない場合でも、プログラムでその値を明示する必要があります。そのために、メソッドが voidを返すことを宣言できます。 値。C#および同様の言語では、何も返さないことを意味します。
要素[2]、Speak()
、はメソッド名であり、メソッドの呼び出しまたは実行に使用するものです。プロパティと同様に、メソッドはオブジェクトに属していることに注意してください。
要素[3]、コードブロック 、は、メソッドを呼び出すときにプログラムが実行するコードです。 メソッド本体とも呼ばれるこの種のコードブロックも表示される場合があります 。今のところ、このコードブロック内で、「Woof」を含む行を書き込むようにコンソールに指示します。
。
メソッドを公開する
メソッドができたので、プログラムからメソッドを呼び出したり実行したりして、犬の鳴き声を出すことができます。ただし、問題があり、オブジェクト指向のもう1つの重要な概念を確認する絶好の機会があります。
通常、オブジェクトのプロパティとメソッドにアクセスするには、最初にオブジェクトを保持している変数の名前を記述し、次にプロパティまたはメソッドの名前を記述します。たとえば、Name
の値を取得するには 文字列プロパティ、次のように記述できます:
string dogName = myDog.Name;
Speak()メソッドを実行するには、次のように記述します。
myDog.Speak();
ただし、Program.csでこれを行うと、図4に示すようなエラーメッセージが表示されます。
図4:保護レベルのエラー
「保護レベルが原因で「PettingZoo.Dog.Speak()」にアクセスできません」というエラーは、OOの重要な概念である抽象化が原因で発生します。 。
要するに、抽象化は、私たちがそれらの詳細を知る必要がないときに、何かがどのように機能するかの詳細を取り除きます。私たちのプログラムでは、犬が話すことができることを知る必要があるだけですが、それがどのように行われるかについてはあまり気にしません。
代わりに、抽象化により、クラス設計者は、オブジェクトを操作できるクラスへのアクセスポイントを考え出すことができます。多くの言語では、アクセス修飾子を介してこのアクセスを有効にしています。 。
C#は、デフォルトで、クラスの外部からプロパティとメソッドを非表示にします。ただし、この種の分離に関するポリシーは他の言語では異なり、JavaScriptなどの一部の言語はこのレベルの保護さえ提供していません。
ただし、原則は、すべての人に使用してもらいたいものを公開し、残りを非表示にするというものです。少なくともC#で公開部分を作成するということは、単にキーワードpublic
を追加することを意味します。 誰かにアクセスしてもらいたいプロパティとメソッドの前。したがって、Dog
を更新すると public
を追加するクラス void Speak()
の前 図5に示すように、Animals.csの行では、赤い波線がProgram.csで消えます。
図5:パブリックメソッドの宣言
追加のボーナスとして、メソッドを公開すると、VisualStudioはIntelliSenseオートコンプリートシステムを介して使用可能なオプションにメソッドを追加します。 myDog
と入力すると ピリオドを押すと、図6に示すように、そのオブジェクトのすべてのパブリックプロパティとメソッドのリストが表示されます。
図6:新しいパブリックメソッドを使用したVisualStudioIntellisenseオートコンプリート
他のコードエディタにも同様のオートコンプリートシステムがあります。これらの自動完了は、プログラマーにとってこれらのエディターの主な利点の1つです。プログラマーとして進化するにつれて、これらの機能を愛するようになるでしょう!
。
これですべてのエラーが修正されたので、プログラムを実行して犬が吠えるのを確認できるはずです。 Program.csにブレークポイントを設定するには、左マージンをクリックするか、myDog.Speak()
の後にカーソルを角かっこに置きます。 そしてF9を打つ。次に、F5キーを押してプログラムを実行します。図7に示すように、コンソールがポップアップし、犬の吠え声からの出力が表示されます。
図7:私たちの犬が話す!
もちろん、複数の変数を作成し、それらにオブジェクトをインスタンス化することで、たくさんの犬を作成できるようになりました。たとえば、図8のようなものを試すことができます。
図8:話す2匹の犬
同様の結果が得られましたか?すばらしいです。まだまだやるべきことがあるので、背中を軽くたたいてください。結局のところ、オブジェクト指向によって一意のオブジェクトを作成できることを約束してきました。私たちが行ったのは、2つの同一の「犬」を作成することだけです。次に、コンストラクターを使用して個別の一意のオブジェクトを作成する方法を示します。
。
。