- - PR -
Class、Namespaceの名称が同じだとエラーになる??(ソース有り)
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-07 18:46
いつも勉強させていただいております。今回は質問をさせていただけないでしょうか。
VB.NETで下記のようなサンプルのコードを書いてみました。 Namespace aa1 End Namespace Namespace aa1 End Namespace Public Class CC1 End Class Public Class CC1 End Class Classは同名だとエラーになりますが、Namespaceは同名でもエラーに なりません。 これは、やっぱり言語仕様なのですよね。 どうも、釈然としないので投稿しました。 ClassとNamespace の根本的な意味合いが違うから、このような事になるの でしょうか? この事を理解できるような情報があれば、教えていただけないでしょうか。 それでは、よろしくお願いします。 | ||||||||||||
|
投稿日時: 2007-02-07 19:05
?
Namespace がエラーになるとしたら、同じ名前空間に属するクラスはすべて一つのファイルに書かないといけなくなりますが? _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2007-02-07 20:33
学校の種類を名前空間と例え、
学校そのものをクラスと例えたとしましょ。 市川第一小学校、市川第二小学校はどちらも「市立.小学校」という名前空間。 でも学校名は一緒じゃだめ。 ・・・例えが悪いかな? | ||||||||||||
|
投稿日時: 2007-02-07 20:42
別々の名前空間であれば、エラーになりません。 そして、この時点で名前空間の役割に気付いて欲しいところです。 今回エラーになるのは、同名のクラスを同じ名前空間に定義していることになるからです。 これでは、そのクラスを限定する際に曖昧が生じますよね。 名前空間を別々にするとエラーにならないのは、名前空間とクラス名の組み合わせでユニークになるからです。 この名前空間とクラス名を組み合わせた完全なパスは、「完全修飾名」 と呼ばれます。
この名前空間なる概念を持っている言語は他にもたくさんありますが、このような仕様になっています。
以前、どこかで書いたような気がしますが、 名前空間は、クラスならびに定義を組織化するための機構です。 名前の衝突を避けるために存在していると同時に、クラス群をまとめる役目をもっています。 これが、名前空間における組織化の概念です。 (Java で言う package に相当しますが、Java とは異なりスコープ的な意味を持ちません) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-02-07 20:53
このメタファを使うならば、 クラスを文字通り 'クラス' にたとえ、 名前空間を '学校名' にたとえたとしましょう。 「3年B組」 だけでは、どの '学校' か限定されませんが、 「桜中学校.3年B組」 とすれば、どの学校かまで限定され曖昧さがなくなります。 さらに '名前空間' は、ネストすることができます。 「桜中学校」 だけでは、完全に限定できないとすれば、'地区' を上位の名前空間に含めれば良いです。 つまり、「足立区立.桜中学校.3年B組」 とすれば、もっと広いスコープで限定することができます。 例文 : 「足立区立.桜中学校」 名前空間の 「3年B組」 クラスには、「金八先生」 というメンバが存在します。 # 最近のプログラミング言語って、本当に面白い指向になっていますよね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-02-08 00:33
面白いご意見ですね。 どうして釈然としないのかを、もう少し詳しくお聞かせいただきたいです。 できましたら「どうあるべきか」という点についてもお聞かせいただきたいのですが。 お願いばかりで恐縮ですが、僕自身が、このような疑問を持ったことが無かったので純粋に興味があります。 _________________ R・田中一郎 @ わんくま同盟 - R.Tanaka.Ichiro’s Blog ← ブログはじめました [ メッセージ編集済み 編集者: R・田中一郎 編集日時 2007-02-08 01:23 ] | ||||||||||||
|
投稿日時: 2007-02-08 09:56
ゆかさん、お早うございます。
恐らく囚人さんの回答で納得されているのではないかと思いますが…。 これ↓はクラスを定義していますが、
しかしこちら↓は名前空間を定義している訳ではない、という事ですね。
| ||||||||||||
|
投稿日時: 2007-02-08 10:25
>しかしこちら↓は名前空間を定義している訳ではない、という事ですね。
え?そうなの?定義だと思ってた。 クラスで定義が重複した場合は重複を許さないのでエラー。 っても同じ名前空間じゃないとエラーにならんけど。 んで名前空間の場合は定義が重複していてもビルドの時に統合されるからエラーにならんだけだと理解していたが違うのか・・ |