2

派生クラスが基本クラスからコードを継承し、派生クラスのスコープでそのコードを評価するための設計パターンは、主流の言語に存在しますか? 例 (疑似 C++ 構文を使用):

class Base {
    // (How) can this be modified to be evaluated 
    // in the derived class's scope so that it
    // prints the size of the derived class?
    void printSize() {
        cout << sizeof(*this) << endl;
    }
};

class Derived : public Base {
    void* dummy;
};

int main() {
    Base base;
    Derived derived;
    base.printSize();  
    derived.printSize();  // Should be > base.printSize().
    return 0;
}

これはマクロで実行できることはわかっていますが、そのためにはマクロを派生クラスのスコープで明示的にインスタンス化する必要があります。

編集:printSize()明確にするために、この投稿の要点は、すべての派生クラス で手動で再実装したり、同様のものを使用したくないということです。コンパイラ/インタープリタにこれを実行させるための巧妙なパターンを探しています (私の例では C++ を使用しましたが、言語にこれに対する解決策があるかどうかを知りたいです)。

編集#2: これは動的言語ではかなり簡単だと思います。私は静的に型付けされた言語、主に C++、Java、D のソリューションに興味があります。

編集 # 3:パターンは、コンパイル時の型ではなく、実行時の型で機能する必要があります。したがって、D のテンプレートのこのパラメーターは解決策ではありません。

4

4 に答える 4

1

D には、Template This Parameterを使用するより良い解決策があります。

コード: http://dpaste.1azy.net/78810a79

import std.stdio;

class Base {
  int[64] dummy1;
  final static size_t getSize(this T)() {
    return __traits(classInstanceSize, T);
  }
}

class Derived : Base {
  int[16] dummy2;
}

void main() {
  writeln(Base.getSize());    // prints: 272
  writeln(Derived.getSize()); // prints: 336
}

編集:Ops、これは静的タイプでのみ機能します。あなたの問題の解決策ではありません。

于 2013-05-15T20:17:47.047 に答える