デジタルちんぶろぐ

デジタルな話題

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  268  : 記事  0  : コメント  4419  : トラックバック  79

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

C++だとこんなことができますよね

#include <iostream>

template<class T> class Base {
protected:
    const char* p_;
public:
    Base(const char* p) : p_(p) {}
    void func() { static_cast(this)->foo(); }
};

class Derived : public Base<Derived> {
public:
    Derived(const char* p) : Base<Derived>(p) {}
    void foo() { std::cout << p_ << std::endl; }
};

int main()
{
    Derived("Hello, C++").func();
}

DerivedクラスはBase<Derived>クラスの派生クラスになっているわけです。

このような記述をすることでBaseクラスは未だ知らないDerivedクラスの仮想関数ではない任意のメンバをアクセスできます。

同じことをC#でやろうとすると…

namespace Program {
    public class Base<T> {
        protected string str_;
        public Base(string str) { str_ = str; }
        public void func() { ((T) this).foo(); }
    }

    public class Derived : Base<Derived> {
        public Derived(string str) : base(str) {}
        public void foo() { System.Console.WriteLine(str_); }
        static void Main() {
            (new Derived("Hello, C#")).func();
        }
    }
}

crtp.cs(5,31): error CS0030: 型 'Program.Base<T>' を型 'T' に変換できません。

と言われてしまう。コンパイル時に解決できそうなんだけど…

んで書きなおした。

namespace Program {
    public abstract class Base<T> {
        protected string str_;
        public Base(string str) { str_ = str; }
        public void func() { foo(); }
        public abstract void foo();
    }

    public class Derived : Base<Derived> {
        public Derived(string str) : base(str) {}
        public override void foo() { System.Console.WriteLine(str_); }
        static void Main() {
            (new Derived("Hello, C#")).func();
        }
    }
}

意味ねぇorz

因みにC#をコケにするつもりはありません。それどころか最近ちょっとC#好きになってきてます

このころより考えが進歩したかなw

投稿日時 : 2009年3月29日 1:13

コメント

# re: [C#] class Derived : Base&lt;Derived&gt;と書いてみたいの 2009/03/29 10:07 melt
せんせー、いろんなタグが消えててわけわかめになっております。

# re: [C#] class Derived : Base&lt;Derived&gt;と書いてみたいの 2009/03/29 11:33 あんどちん
修正しました。

LiveWriterで書いてからWebで編集するとそうなるみたい。
今回は「プログラミング」のカテゴリに入れ忘れたからそこにチェック付けただけなんですが…


# re: [C#] class Derived : Base&lt;Derived&gt;と書いてみたいの 2009/03/29 19:32 アキラ
C#でCRTPできますよー
http://d.hatena.ne.jp/faith_and_brave/20071206/1196934096

http://d.hatena.ne.jp/NyaRuRu/20071206/p2

# re: [C#] class Derived : Base&lt;Derived&gt;と書いてみたいの 2009/03/30 1:01 あんどちん
interface使うってのはねぇ
NyaRuRuさんとこのは今の僕には難解です

でも出来るんですね。CRTPにこだわっていないんですが、ジェネリックで
((T)obj).[member of T]
できるかが気になったので。


Post Feedback

タイトル
名前
Url:
コメント: