java - 继承:评估派生类的范围?

原文 标签 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“对象”通常是哈希映射,并且继承树各个级别的所有变量都在同一个“作用域”中(即,相同的哈希图)。对于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是(也许)指针的大小,但是Base部分Derived的代码实际上是空的。大多数平台可能会为此类空类分配1个字节,并且指针通常大于该字节,但未指定。)

相关文章:

java - 该代码在关键部分是否违反了互斥?

java - 如何将徽标在ActionBar中居中?

java - 如何使用matlabcontol.jar从Java(适用于Android)运行Matlab脚本

c++ - 一个C++客户端无法使用我们新的COM注册的.NET .dll加载,另一个可以工作

c++ - 使用fbx sdk c++从fbx读取纹理文件名

c++ - 指向第二个基础对象的指针

java - 如何使用JAXB将xmlns:xs和xmlns:xsi移至根元素?

c++ - OpenCV的cvAcc()有什么作用?

javascript - 自推对象构造函数

php - 两次输入数据