首页 文章

GotW建议没有公共虚拟功能,但是接口是什么Java?

提问于
浏览
2

根据Herb Sutter的说法,http://www.gotw.ca/publications/mill18.htm建议你不要使用派生类覆盖虚拟函数 . 但纯粹的界面呢,真的那么糟糕吗?具体来说,我在谈论库中的暴露类 . 采取观察者模式:

class Observer {
    public:
        virtual ~Observer() = default;

        virtual void notify() = 0;
};

VS

class Observer {
    public:
        virtual ~Observer() = default;

        void notify() { doNotify() };

    protected:
        virtual void doNotify() = 0;
};

后者真的是我们应该使用的吗?我只是没有看到收益 . 或者Herb Sutter的具体帖子是否过时了?

1 回答

  • 2

    关键是Java中需要“纯接口”,因为您只能从Java中继承一个不是纯接口的类(这确实具有防止钻石继承的优点,因此避免了任何问题) . 在C中,我们可以从多个基类继承,因此不需要纯接口 .

    在Observer的特定情况下,基类只是向单个成员提供成员函数指针的廉价方法,该建议可能不适用 . (在现代C中,根本不可能实现具有基类的Observer,而是使用std :: function,它可以是lambda,或者是绑定函数,或者其他什么 . )

相关问题