web-dev-qa-db-ja.com

名前空間、クラス、オブジェクト、インスタンスの違いは何ですか?

私はHeadsFirst C#を読んでいます(非常に興味深く、ユーザーフレンドリーです)が、名前空間、クラス、メソッド、プロパティなどがすべて「どのように組み合わされているか」を説明するための有用なメタファーがあるかどうか疑問に思いました。

クラスは親で、メソッドは子などですか?それとももっと複雑ですか?

名前空間を家、クラスを部屋(バスルーム)、メソッドをその部屋で実行できること(洗浄など)、プロパティをそのアクティビティを実行するときに実行できること、石鹸を使用、お湯...

...コートをもらいます。

26
RocketGoal

私は言うだろう:

  • 名前空間:車のカテゴリまたはブランド。ブランドは実際に車の製造方法を指示する必要はないことに注意してください。ホンダが常に4つのドアを持っているとか、それが常に4WDを持っていると言うことはできません。そのような詳細は、指示するクラス次第です。 Rich.Carpenterの投稿 名前空間の目的を非常によく説明しています。

  • クラス:特定の車の製造方法の青写真。

  • オブジェクト:車の設計図(クラス)から作成された実際の車(インスタンス)

  • 方法:車のユーザーができること。 Start()IncreaseThrottle()Brake()OpenDoor()など。

  • プロパティ:車に含まれる属性、情報、ビルディングブロック。例えば。総走行距離、色、ハンドルの寸法、ステレオシステムなど。

あなたにとってより高度に見えるかもしれないいくつかの概念。たぶん今はやり過ぎかもしれませんが、興味があれば読んでください:

  • 継承:クラスが別のクラスに基づいており、より具体的な詳細を追加する場合。継承のラインは通常、最も一般的で一般的な側面から、より具体的にすることがもはや意味をなさない点まで続きます。動物の文脈でのこの例:Animal-> Mamal-> Rodent-> Rat-> RattusNorvegicus

  • Aggregates:オブジェクトを「構築」するプロパティ。例えば。 「この車は、4つの車輪、シャーシ、エンジンなどの集合体です」。

  • 属性:オブジェクトを説明するプロパティ。通常、その物理的構造の一部ではありません。例えば。色、最高速度、エンジン容量など。

  • カプセル化:特定のプロパティをユーザーから隠す、または特定のプロパティが誤って使用されないように保護する(したがってオブジェクトに損傷を与える)という概念。例えば。車のクラスのギアプロパティを公開して自由に変更することはできません。それをカプセル化し、Clutch()の前にSetGear()が呼び出されていることを確認します。

  • オーバーライド:クラスが別のクラスから継承する場合、そのクラスからメソッドも継承します。オーバーライドとは、基本的にinheritingクラスがそのようなメソッドの実装を独自の必要な動作に置き換える場合です。次のポイントでの使用例。

  • ポリモーフィズム:実際に使い始めるまで理解するのが難しい概念。これは、特定のタイプを無視できる一般的な参照を使用して、非常に特定の種類のオブジェクトを参照することを意味します(それを知る必要がない場合)。例えば。駐車場にあるすべての車両のナンバープレート番号のプロパティを「読み取り」たい場合は、ブランドが何であるか、またはトレーラーやオートバイなどであっても、実際には気にしません。これを実行できるようにするには、ナンバープレート番号が継承行の最も一般的なクラス(おそらくVehicleクラス)のプロパティであることを確認します。したがって、リスト内のすべてのオブジェクトをVehicleクラスとして参照し、Vehicle::GetLicensePlateNumber()を呼び出すだけで処理できます。番号を取得するために特別な処理が必要な車両は、メソッドをオーバーライドしてこの動作を実装し、必要に応じて動作させることができます。そのため、さまざまなオブジェクトタイプを同じタイプであるかのように使用できますが、動作が異なる可能性があります。

64
sharkin

クラスはオブジェクトの説明であり、メソッドはそれらのオブジェクトが実行できるアクションであると考えてください。

たとえば、私は新しい車を設計します。その車の計画または青写真(クラス)は、実際の物理的な車(オブジェクト)を作成するために使用されるものです。これらの計画は、車に機能的なホーンが必要であることを示しています。そのため、車にホーン機能(方法)を設計しました。これらの計画は、車に4つの車輪があることも示しています。ホイールは、インスタンス化された(オブジェクトの作成時にプロパティに割り当てられた)値が4の車のプロパティになります。色は、別の可能なプロパティになります。プロパティは、オブジェクトの品質または特性(色、高さ、幅など)を記述します。

今、私はトヨタで働いています(実際にはそうではありませんが、我慢してください)。トヨタは私の車の設計図を含む名前空間になります。 Ford、GMなどはすべて、まったく同じ名前(car)とメソッド(honk)を持つ独自の車のデザイン(クラス)を持つことができるため、Toyota、Ford、およびGM =名前空間が異なる場合、アプリケーション内に同じ名前のクラスとメソッドの複数のバージョンを含めることができるため、これらのブループリント(クラス)を個別に区別してください。

お役に立てば幸いです。

28
Rich.Carpenter

一文で:

オブジェクトインスタンスクラス

13
z -

家の設計図のアナロジーを使用する。

青写真はクラスです。それは多くの詳細を指定しますが、家の色、正面玄関の色とスタイルなど、多くのプロパティも省略します。ドアがどこにあるかを青写真で確認すると、そしてそこにドアがあります。

オブジェクトは、その青写真から建てた家です。同じ設計図から多くの家を建てることができます。全体的な外観とレイアウトはすべて同じですが、外側のペイントの色、正面玄関のスタイルなど、プロパティが異なる場合があります。ただし、正面玄関はすべての家の同じ場所にあります。

特定の青写真から、これらの家のそれぞれを家のインスタンスと呼ぶことができます。

したがって、 @ yx が雄弁に言っているように、オブジェクトはクラスのインスタンスです。

クラスは通常、ある種のオブジェクトを表すために使用されます。請求書のような物理的なオブジェクトに似ている可能性がありますが、より抽象的なものである可能性もあります。

私たちは動物の働きに精通しているため、クラスの例として動物が使用されることがあります。それで、いくつかの動物を使用しましょう:

クラスは、CatDogのような一種の動物である可能性があります。クラスのインスタンスを作成すると、Fido thedogのように特定のオブジェクトになります。

名前空間はクラスを論理的にグループ化するために使用されるため、CatクラスとDogクラスを名前空間_Animals.Pets_に配置できます。名前空間は階層的ですが、それによって名前空間内のクラスが階層化されるわけではありません。これらは単なる異なるグループであるため、Animals名前空間のクラスは、_Animals.Pets_名前空間のクラスの親ではありません。

メソッドは、Eat()Sleep()のようにオブジェクトが行うことです。

プロパティは、NumberOfLegsIsSleepingなどのオブジェクトの側面を説明するものです。

2
Guffa

あなたのクラスは、さまざまなアクションを実行する職位である可能性があります(つまり、アクションはメソッドです)。アクション(オブジェクトのさまざまなインスタンス)を実行するさまざまな個人がいる場合があります。

これらの職位のコレクションは、部門に常駐します。財務にはその仕事/クラス(会計士、本の管理人など)がありますが、彼らは独自の種類の仕事/クラスを持っているセールスと協力する必要があります。

この意味で、さまざまな部門が名前空間です。セールスで働く人々は、最終的にはファイナンスと協力する必要があります。複数の部門(または名前空間)が協力して目標を達成しています。

現在、これらの部門は会社の一部である可能性があります。その会社は、これらすべての部門のルート名前空間になります。そして、そのような方法で、名前空間が存在し、一緒にネストすることができます。

一言で言えば、名前空間は責任をかなり分離します。

複数の会社が協力して(Microsoft .net名前空間が独自の名前空間と連携している)、全体像を把握できると想像してみてください。

2
MoSlo

オブジェクトはクラスのインスタンスになることができますか?

2
Eppz

クラスは、オブジェクトがどのように見えるか、つまり、オブジェクトに含まれるデータ、オブジェクトが持つメソッド、およびオブジェクトが関連する他のクラスを定義します。

インスタンスは、そのクラスの単一の作成されたエンティティであり、クラス定義を参照として使用して作成されたオブジェクトです。

1
PaulJWilliams

クラスはオブジェクトの一種です。たとえば、1つのクラスのオブジェクトをいくつでも持つことができます。

インスタンスはオブジェクトであり、多くの言語ではすべてのオブジェクトがクラスのインスタンスでもあるため、2つの用語が同じ意味で使用されることがあります。人々は「インスタンス」という言葉を使用して、クラスについてではなく、そのクラスのオブジェクトについて話していることを明示します。

1
thomasrutter

classはオブジェクトのテンプレートです。これは、そのタイプのクラスのオブジェクトにどのメンバー変数とメソッドが入るかをコンパイラーに指示するソースコードです。

オブジェクトインスタンスは実際には同じです。クラステンプレートから、クラスの多くのインスタンス(またはオブジェクト)を作成できます。それぞれがクラスで定義されたすべてのメンバーとメソッドを独自のメモリに持っています(ただし、メンバーを共有することもでき、メソッドはほとんどの場合インスタンス間で共有されます)。

1
Bill the Lizard