java - 继承 : Evaluating In Derived Class's Scope?

标签 java c++ oop design-patterns d

派生类在任何主流语言中是否有设计模式从基类继承代码并在派生类的范围内评估该代码?例如(使用伪 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的模板这个参数不是解决方案。

最佳答案

如果“主流”包括主流脚本语言,如 Perl 或 Python,那么是的。 Perl 方法通常在最派生的范围内“求值”,因为 Perl“对象”通常是一个散列映射,并且来自继承树所有级别的所有变量都在相同的“范围”(即,进入相同的 HashMap )。 Python 类也会发生类似的情况,尽管 (IIRC) Python 有一种创建符号的方法,该符号将被破坏,以便根据编写代码的类来区分它。当然,这些语言都没有“sizeof” "概念本身,因此您的特定示例不会特别相关。

在 C++ 中,根据您的示例调用的类型来决定成员函数的当前类的概念(据我所知)并不奏效。但是,您可能能够接近使用模板描述的内容。例如,像这样:

template<typename T>
void printSize( T &t ) {
    cout << sizeof(t) << endl;
}
int main() {
    Base base;
    Derived derived;
    printSize(base);
    printSize(derived);
}

(旁注:在 C++ 中,由于您的 Base 为空,因此实际上无法保证 sizeof(Base) > sizeof(Derived) --- 可以采用空基优化,这样一个普通的 Base 是(可能)一个指针的大小,但是 Derived 的 Base 部分实际上是空的。大多数平台可能会为这种空类分配1个字节,指针通常比这大,但没有指定。)

关于java - 继承 : Evaluating In Derived Class's Scope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16568194/

相关文章:

java - 在 Spring Security 中以编程方式设置登录 URL

java - mahout 0.7中mahout 0.5中VectorWritable.addTo的等效方法是什么?

c++ - strchr 不适用于 char[]

c++ - 以编程方式关闭共享文件

java - 用java从字符串矩阵中替换字符串中的某个单词

php - 工厂方法可能违反 Demeter 法则?

java - GWT-如何在其他项目中对一个项目进行 RPC 调用(使用服务器端)?

java - 如何转储 HashMap 的内容?

c++ - 为什么需要在虚拟表中输入纯虚函数

php - php __set()、__get和简单设置、获取函数的区别