じゃんぬねっと日誌

ネタと雑記と時々プログラミング

目次

Blog 利用状況

ニュース

お前スナイパーというよりクルクルパーだな

Sponsored Link

Rakuten

運営サイト

  • C# と VB.NET の入門サイト

書庫

C# の静的クラスは abstract で sealed なヘンテコクラス

C# 2.0 から、静的クラス (static class) が使える (強制できる) ようになりました。そのクラスには、静的なメンバ (VB 的には、共有メンバ) しか含められないというものです。

さて、静的クラスとして定義されたクラスのメタ属性はどうなっているんでしょうか? 確認してみますと、面白いことに、abstract で sealed なクラスになっているのです。VB に置き換えると、MustInherit で、NotInheritable なクラスということです。便宜上とはいえ、おかしい感じがしますよね。

次のコードで確認してみましょう。

C# 2.0

namespace Namespace1 {

    public static class Program {
        private static void Main() {
            System.Type oType = typeof(TMakiMakiLove);

            System.Console.WriteLine("abstract = {0}", oType.IsAbstract);
            System.Console.WriteLine("sealed   = {0}", oType.IsSealed);
        }
    }

    public static class TMakiMakiLove {
        public static void MosaMosaAA() {
            return;
        }
    }

}

出力結果

abstract = True
sealed   = True

VB の場合「静的クラス」に対応するのは「モジュール」とされていますが、こちらとは、完全にイコールではない、ということがわかります。もちろん、J# (Java) の static クラスともイコールではありません。(こちらは、当然かw)

タイトルにあるような「静的クラス」という言葉は、混乱を招く なぁ、と。完全にイコールではないにしても「モジュール」と表現した方が、まだ良いかもしれません。

# でも、書くときは 'static class' と書かねばならない。

投稿日時 : 2006年6月20日 9:21

コメントを追加

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 10:55 じゃんぬ

どっこいしょっと。

@IT 会議室 - Type からクラスが静的クラスであることを判断できますか
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31206&forum=7

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 15:07 シャノン

ふむ。
MustInherit かつ NotInheritable というと矛盾ですが、abstract かつ sealed はさほど違和感がありません。
abstract は「継承しなければならない」ではなく「インスタンスを作れない」という意味だと思っていますから。
改めて考えると、MustInherit というネーミングの方が気持ち悪いなぁ。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 16:06 名無しぃシャープ

どーもー。

> abstract は「継承しなければならない」ではなく「インスタンスを作れない」という意味だと思っていますから。

これを理由におかしいと言うのはおかしいよね。
abstractの意味は、『インスタンスを作れない』ってわけでもないよね。
『インスタンスを作れない』も、abstractであるがゆえの結果のひとつにすぎないでしょ。

『継承しなければならない』は、結果から見ても意味的にはおかしい (静的メンバへはアクセスできるわけで継承しなくても利用できる)というのであれば、わかるけど本題とは関係ないよね。

本題は、public abstract sealed class Hoge {} なんていうクラスが、普通はあり得ないので違和感がある。ってことでしょ。
言葉の意味どうこうではなく、同居できないってこと。

とかいいつつ、本題は『混乱を招く。』のような気もしてきた。
僕の個人的な意見としては、C#もsharedキーワードの方が良かったんじゃないかなって思う。
静的クラスって名前ではなく共有クラスって方がしっくりくる。

staticってややこしい言葉だと思う。他の言語を相手にしなきゃいいんだろうけど。
もちろんキーワードを統一しなさいって意味ではない。
単に紛らわしいものは避けた方がいいと思うなぁ。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 16:48 シャノン

個人的には、abstract sealed が成立しているということ以前に、静的クラスというものの存在自体が気持ち悪いので、その問題の前では些細なことです。

> abstractの意味は、『インスタンスを作れない』ってわけでもないよね。

個人的に abstract の意味は「インスタンスを作れない」、より正確に言えば「インスタンスが存在し得ない」ということ以外の何物でもありません。
もっとも、ここで俺が言う「abstract」は、実際にはオブジェクト指向プログラミング言語一般における、いわゆる「抽象クラス(C++ では純粋仮想クラス)」を指しているものであり、MSIL が規定するところの abstract とは一致していない可能性はあります。

参考までに聞かせてください。
名無しぃシャープさんが思うところの「abstract」の意味とは?

MustInherit も、あながちおかしくないという気はしてきました。
MustInherit は、「いついかなる時でも継承しなければならない」ではなく「インスタンスを作ろうとするならば継承しなければならない」なので、「インスタンスを作ろうとするならば継承しなければならないが、しかし継承することは出来ない」は、インスタンスを作ろうとしなければ矛盾しません。

> 本題は、public abstract sealed class Hoge {} なんていうクラスが、普通はあり得ないので違和感がある。ってことでしょ。

C# の言語仕様レベルと IL レベルを比較してはいけない気が。
C# ではできないけれど IL ではできることはいくつもあったはずです。
それらすべての違和感を抱くのであれば、別に構いませんけれど。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 16:50 シャノン

> 個人的に abstract の意味は「インスタンスを作れない」、より正確に言えば「インスタンスが存在し得ない」ということ以外の何物でもありません。

このあたりに突っ込まれると、本題をどんどん逸れて行ってしまうので、突っ込むなら別の場所でお願いします。

> C# の言語仕様レベルと IL レベルを比較してはいけない気が。

こっちが本題ってことで。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 17:14 名無しぃシャープ

最初に言っておくね。
ちょっとイライラする表現があると思う。
技術どうこうではない部分だし、賛成意見も入ってるから見逃してねw

> 個人的には、abstract sealed が成立しているということ以前に、静的クラスというものの存在自体が気持ち悪いので、その問題の前では些細なことです。

僕がさっき最後に書いたことだけど、本題は『静的クラスなんて言い回し』ってことじゃないんですかね?

> 個人的に abstract の意味は「インスタンスを作れない」、より正確に言えば「インスタンスが存在し得ない」ということ以外の何物でもありません。

個人的にね。じゃあ、一方的に押し付けるのはよくないかな。
一方的というのを補足しておくと、(ま、補足するまでもないと思うけど)自分の意見を言うだけならともかく、人の意見を否定しておいた上で、自分だけ『個人的に』なんてのはちょっとディスカッションの場としては好ましくないんじゃないかなぁ。
単に個人的な感想を述べるにとどまるならともかく、一応他人の意見は否定した上ってのがちょっとね。

> 参考までに聞かせてください。
> 名無しぃシャープさんが思うところの「abstract」の意味とは?

抽象。それ以上でもそれ以下でもないです。
だから、インスタンスが作れないだの継承がどうこうだのは結果だと思うんですよ。

> MustInherit も、あながちおかしくないという気はしてきました。
> MustInherit は、「いついかなる時でも継承しなければならない」ではなく「インスタンスを作ろうとするならば継承しなければならない」なので、「インスタンスを作ろうとするならば継承しなければならないが、しかし継承することは出来ない」は、インスタンスを作ろうとしなければ矛盾しません。

でもMustだからね。微妙だよね。
これについては、シャノン氏の当初の意見の方に賛成かな。

> C# の言語仕様レベルと IL レベルを比較してはいけない気が。
> C# ではできないけれど IL ではできることはいくつもあったはずです。
> それらすべての違和感を抱くのであれば、別に構いませんけれど。

なるほど。それはわかりました。
C#でできない定義をIL上できてしまってるってことより、なんでsealedでabstractにするんだろう?というのに違和感があるかな。
VBのモジュールではそのような結果にはならないわけで、理由があっての設定だと思いたいんですよ。
だから、C#の定義でできないからこそ、違和感があるんですね。
理由があるなら違和感はなくなります。

Javaの静的クラスとも当然違うわけで、

> 静的クラスというものの存在自体が気持ち悪い

そういう意味であれば、これも賛成っす。

> このあたりに突っ込まれると、本題をどんどん逸れて行ってしまうので、突っ込むなら別の場所でお願いします。

じゃあ、書かなきゃいいのになんて思ってしまったw
だって、自分は言いたいことだけ言った時点で『はい、ストップ』は、ちょっとずるくないかな?w
ってことで、ごめんね。書いちゃった。

本題についてはよくわかったので、大丈夫よ。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 17:20 名無しぃシャープ

ちょっと追記。

> じゃあ、書かなきゃいいのになんて思ってしまったw
> だって、自分は言いたいことだけ言った時点で『はい、ストップ』は、ちょっとずるくないかな?w

も、ディスカッションの場では好ましくないんじゃないかなぁ・・・ってことです。
ずるいってのは不適切だったね。怒らせたらごめんね。

> 抽象

については、この抽象の意味を決めるのが言語仕様ってことでの意見だったら、インスタンス化できないってより、インスタンスメンバについては継承しなきゃならないって方がしっくりくるかな。
どうかな?

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 17:24 シャノン

> VBのモジュールではそのような結果にはならないわけで、理由があっての設定だと思いたいんですよ。

モジュールはモジュール、クラスはクラスだからじゃないかな。
モジュールも手放しで賛成は出来ませんけど、静的クラスよりマシだと思っています。

> だって、自分は言いたいことだけ言った時点で『はい、ストップ』は、ちょっとずるくないかな?w

全面ストップとは言ってません。ただ「ここではストップ」。
場所を移すならば、いくらでも語り合いましょうとも。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 17:30 名無しぃシャープ

> モジュールはモジュール、クラスはクラスだからじゃないかな。

でも、abstractでsealedな理由にはならないんじゃないかな?

> モジュールも手放しで賛成は出来ませんけど、静的クラスよりマシだと思っています。

うーん、シャノン氏の個人的な意見でも良いのですが、どこが違うと思います?
僕は同じものくらいに思っています。
静的メンバしか含められないことを強制されているし、継承も当然できない。

> 全面ストップとは言ってません。ただ「ここではストップ」。

『ここでは』って書いて欲しかったかなぁw

> 場所を移すならば、いくらでも語り合いましょうとも。

もうお互いいいんじゃないかな?
他に何かある?

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 17:50 シャノン

例えばこの問題で、System.Refrection.TypeAttributes に Static というのが新設されていたら、問題は全て解決?
でも、それをやるには、C# コンパイラの変更だけで片がつかない。IL に手を入れないといけない。
手を入れるべきところではためらうべきではありませんが、Microsoft はこれを、表面的なコンパイラの変更だけで片付けた…ようにも見える。
そのために、abstract と sealed を本来の用途でないところに流用しているのがおかしい、ということかな?
なるほど、abstract が抽象で、sealed が具象ということなら、それは確かに対義語だから矛盾で、単に静的クラスという性質を得るためだけに組み合わせているならば、違和感もある。

けれど、IL の上では、abstract と sealed は矛盾していないわけでしょう。ランタイムエラーが出ないわけだし。
個人的には、abstract の意味は「インスタンスが存在し得ない」なので、組み合わせても矛盾ではないと思っているのですが。
abstract と sealed は対義ではなく直交した概念だと思うので、組み合わせること自体に問題はないけれど、組み合わせた結果出てくる「静的クラス」というものには違和感がすごい。

> うーん、シャノン氏の個人的な意見でも良いのですが、どこが違うと思います?

モジュールは型ではない、という点ですかね。
クラスには「インスタンスが作れるクラス」と「作れないクラス」があるけれど、モジュールにはそもそも「インスタンス」という概念が存在しない。これは大きい違いだと思います。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 17:54 シャノン

> もうお互いいいんじゃないかな?
> 他に何かある?

最近、C# だとか Java だとかいう個別の言語についてではなく、「オブジェクト指向」というもの一般について考えをめぐらせているので、それについて語り合える場があればいいかなぁ、と。1対1に限った話でもなくね。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 17:58 シャノン

連投ごめんぽ。

俺の考えは、「abstract」の意味についての俺なりの解釈に立脚している。
で、俺と名無しぃシャープさんでは、abstract の意味について、見解の相違がある。
ただ、ここで俺の解釈を言い始めると、どうしてもこのトピックで話すべき範疇をはみ出してしまう。
それはまずいんじゃない? と思う。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/20 18:39 じゃんぬ

Σ(;゚Д゚) 白熱してる...

>シャノンさん

どこかに場所を作った方が良いでしょうか?

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/21 12:32 名無しぃシャープ

> 例えばこの問題で、System.Refrection.TypeAttributes に Static というのが新設されていたら、問題は全て解決?

別にそんなことはいっとらんでしょうw

> 組み合わせた結果出てくる「静的クラス」というものには違和感がすごい。

うん。個々は激しく同意する。
当初から言っていたが、静的クラスって表現はやめた方がいいと思う。僕も。

> モジュールは型ではない、という点ですかね。

ああそっか。staticよりStandardModule属性のついたクラスに過ぎないという考えだから確かにそうだね。

> ただ、ここで俺の解釈を言い始めると、どうしてもこのトピックで話すべき範疇をはみ出してしまう。
> それはまずいんじゃない? と思う。

了解。大半が僕のせいだと思うので、しばらくおとなしくしてよう。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/21 17:14 R・田中一郎

妙な、奇妙な、不思議な、とあるなかで、ヘンテコという表現をあえて選択したじゃんぬさんのセンスがナイスです。

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/22 10:57 ぽぴ王子

ヘンテコという表現で

ヘンな外人 デキッコナイス

を思い出したのはオレだけのはずだ!ww

# re: C# の静的クラスは abstract で sealed なヘンテコクラス 2006/06/27 4:41 はっきり言って

abstractでsealedなんてのは実装詳細であり、
C#ではstaticクラスです。
#まあそうは言ってられない事情も場合によってはありますが…

# ボンジュール♪ モジュール♪ 2007/04/10 11:18 とりこびと ぶろぐ。

ボンジュール♪ モジュール♪

タイトル  
名前  
URL
コメント