名前空間、クラス、オブジェクト、インスタンスの違いは何ですか?
-
03-07-2019 - |
質問
Heads First C#を読んでいます(非常に興味深く、ユーザーフレンドリーです)が、名前空間、クラス、メソッド、プロパティなどがすべてどのように「適合する」のかを説明するのに役立つメタファーがあるのではないかと思いますか?
クラスは親、メソッドは子などですか?それとももっと複雑ですか?
ネームスペースは家、クラスは部屋(バスルーム)、メソッドはその部屋でできること(洗濯など)であり、プロパティはそのアクティビティを行うときにできること、石鹸、お湯を使用...
...コートを手に入れます。
解決
私は言うでしょう:
-
ネームスペース:車のカテゴリまたはブランド。ブランドが実際に車の製造方法を決定する必要がないことに注意してください。ホンダが常に4つのドアを持っている、または常に4WDを持っていると言うことはできません。そのような詳細は、指示するクラス次第です。 Rich.Carpenterの投稿は、名前空間の目的は非常に優れています。
-
クラス:特定の車の作り方の青写真。
-
オブジェクト:車の設計図(クラス)から作成された実際の車(インスタンス)
-
方法:車のユーザーができること。
Start()
、IncreaseThrottle()
、Brake()
、OpenDoor()
など -
プロパティ:車に含まれる属性、情報、構成要素。例えば。総走行距離、色、ステアリングホイールの寸法、ステレオシステムなど
より高度に見えるかもしれない概念。たぶん今はやり過ぎかもしれませんが、もし興味があれば読んでください:
-
継承:クラスが別のクラスに基づいており、より具体的な詳細を追加する場合。継承のラインは、通常、最も一般的で一般的な側面から、より具体的であることがもはや意味をなさないポイントまでずっと続きます。動物のコンテキストでのこの例: Animal-> Mamal-> Rodent-> Rat-> RattusNorvegicus
-
集計:「ビルド」するプロパティ。オブジェクト。例えば。 "この車は、4つの車輪、シャーシ、エンジンなどの集合体です。 ''
-
属性:オブジェクトを説明するプロパティで、通常は物理的な構造の一部ではありません。例えば。色、最高速度、エンジン容量など。
-
カプセル化:特定のプロパティをユーザーから隠す、または特定のプロパティが誤って使用されないようにする(それによりオブジェクトを損傷する)概念。例えば。車のクラスのギアプロパティを自由に変更することはできません。それをカプセル化し、
SetGear()
の前にClutch()
が呼び出されるようにします。 -
オーバーライド:クラスが別のクラスを継承する場合、そのクラスからメソッドも継承します。オーバーライドは、基本的に inheriting クラスがそのようなメソッドの実装を独自の必要な動作で置き換える場合です。次のポイントでの使用例。
-
多態性:実際に使用を開始するまで把握するのが難しい概念。特定のタイプを無視できる汎用参照を使用することで、非常に特定の種類のオブジェクトを参照することを意味します(知る必要がない場合)。例えば。 「読む」場合は、駐車場にあるすべての車両のナンバープレート番号のプロパティ、ブランドが何であるか、あるいはトレーラーやオートバイなどであるかどうかは気にしません。これを行うには、ライセンスプレート番号が継承行の最も一般的なクラス(おそらく
Vehicle
クラス)のプロパティであることを確認します。したがって、リスト内のすべてのオブジェクトをVehicle
クラスとして参照し、Vehicle :: GetLicensePlateNumber()
を呼び出すだけで処理できます。番号を取得するために特別な処理を必要とする車両は、メソッドをオーバーライドしてこの動作を実装し、必要に応じて動作させることができます。そのため、広範囲のオブジェクトタイプを、あたかも同じタイプであるかのように使用できますが、異なる動作をすることができます。
他のヒント
クラスをオブジェクトの説明と考え、メソッドをそれらのオブジェクトが実行できるアクションと考えます。
たとえば、私は新しい車を設計しています。その車の計画または設計図(クラス)は、実際の物理的な車(オブジェクト)の作成に使用されるものです。これらの計画は、車に機能的なホーンが必要であることを示しています。そのため、車にクラクション機能(メソッド)を設計しました。これらの計画は、車に4つの車輪があることも示しています。ホイールは、インスタンス化された(オブジェクトの作成時にプロパティに割り当てられた)値が4の車のプロパティになります。色は別の可能なプロパティになります。プロパティは、オブジェクトの品質または特性(色、高さ、幅など)を記述します。
今、私はトヨタで働いています(実際はありませんが、私と一緒に耐えてください)。トヨタは私の車の設計図を含む名前空間になります。フォード、GMなどはすべて同じ名前(車)とメソッド(ホンク)で独自の車のデザイン(クラス)を持つことができるため、トヨタ、フォード、GMの名前空間はそれらの青写真(クラス)を別々に保ち、異なるネームスペースがある場合、アプリケーション内で同じ名前のクラスとメソッドの複数のバージョンを持つことができるため、明確です。
役立つこと。
1つの文で:
オブジェクトはクラスのインスタンスです
家の設計図の例えを使用して。
ブループリントはクラスです。それは多くの詳細を指定しますが、家の色、玄関の色やスタイルなどの多くのプロパティも除外します。ドアがどこにあるのか、青写真を確認することで、ドアがあることを 。
オブジェクトとは、その設計図から構築する家です。同じ設計図から多くの家を建てることができます。それらはすべて全体的に同じ外観とレイアウトを持っていますが、外側の塗料の色、正面玄関のスタイルなど、プロパティは異なる場合があります。正面玄関はすべての家の同じ場所にあります。
特定の設計図から家のこれらの各家のインスタンスを呼び出すことができます。
つまり、 @yx が雄弁に言ったように、オブジェクトはクラスのインスタンスです。
クラスは通常、何らかのオブジェクトを表すために使用されます。請求書のような物理的なオブジェクトに似ている場合もありますが、より抽象的なものでもあります。
動物は、動物がどのように機能するかをよく知っているため、クラスの例として使用されることがあります。それでは、いくつかの動物を使用しましょう:
クラスは、 Cat
や Dog
などの動物のようなものです。クラスのインスタンスを作成すると、Fido the dogのような特定のオブジェクトになります。
名前空間はクラスを論理的にグループ化するために使用されるため、 Cat
および Dog
クラスは名前空間 Animals.Pets
に配置できます。名前空間は階層的ですが、名前空間内のクラスは階層化されません。これらは異なるグループであるため、 Animals
名前空間のクラスは、 Animals.Pets
名前空間のクラスの親にはなりません。
Methodsは、 Eat()
や Sleep()
など、オブジェクトが実行するものです。
プロパティは、 NumberOfLegs
や IsSleeping
など、オブジェクトの側面を記述するものです。
あなたのクラスは職種であり、さまざまなアクション(アクションはメソッド、つまりアクション)を実行しています。さまざまな個人がアクション(オブジェクトのさまざまなインスタンス)を実行している場合があります。
これらの職務のコレクションは、部門に常駐します。ファイナンスには仕事/クラス(会計士、簿記係など)がいますが、独自の種類のジョブ/クラスを持つセールスと連携する必要があります。
この意味では、さまざまな部門が名前空間です。営業部門で働く人々は、最終的に財務部門で働く必要があります。複数の部門(または名前空間)が協力して目標を達成しています。
これらの部門は会社の一部になりました。その会社は、これらすべての部門のルート名前空間になります。そして、このような方法で、名前空間が存在し、ネストすることができます。
一言で言えば、名前空間はほとんど責任を分離します。
複数の会社が一緒に作業していることを想像してください(Microsoft .net名前空間が独自の名前空間で作業している)。全体像を把握できます。
オブジェクトはクラスのインスタンスになることができますか?
クラスは、オブジェクトの外観-オブジェクトに含まれるデータ、オブジェクトに含まれるメソッド、関連する他のクラスを定義します。
インスタンスは、そのクラスの単一の作成されたエンティティです。そのオブジェクトは、クラス定義を参照として使用して作成されたオブジェクトです。
クラスはオブジェクトのテンプレートです。そのタイプのクラスのオブジェクトにどのメンバー変数とメソッドが入るかをコンパイラーに伝えるのはソースコードです。
オブジェクトとインスタンスは本当に同じです。クラステンプレートから、クラスの多くのインスタンス(またはオブジェクト)を作成できます。各クラスには、クラスで定義されたすべてのメンバーとメソッドが独自のメモリにあります(ただし、メンバーを共有でき、メソッドはほとんどの場合インスタンス間で共有されます)。
クラスはオブジェクトの一種です。たとえば、1つのクラスのオブジェクトを必要な数だけ持つことができます。
インスタンスはオブジェクトです。多くの言語では、すべてのオブジェクトがクラスのインスタンスでもあるため、2つの用語が同じ意味で使用されることがあります。人々は「インスタンス」という言葉を使用して、クラスについてではなく、そのクラスのオブジェクトについて話していることを明確にします。