0

做这样的事情合理吗?

注意:这是一个最小的工作示例

class A {
    public:
        int getX() { return x; }
    protected:
        int x;
        virtual void setX(int newX) = 0;
};

// Children can modify X
class Can_Modify_X : public A {
     protected:
         void setX(int newX) { x = newX; }
     private:
         using A::x;
};

// Children can't modify X
class Can_Not_Modify_X : public A {
     private:
         void setX(int newX) { }
         using A::x;
};

我知道我不能简单地隐藏一个函数,因为这会违反 Liskov 原则,但是进行private继承并再次指定所有公共方法似乎真的是多余的。

这两个类必须有一个共同的父类(即使它直接是其中之一),并且不能x直接修改。

using奖金:有人可以指出我在这种情况下定义确切行为的地方吗?我尝试用谷歌搜索它,但收效甚微。

4

3 回答 3

1

我知道我不能简单地隐藏一个函数,因为这会违反 Liskov 原则。

完全相同的概念适用于数据成员。

假设您有一个指向 or 实例的指针(或引用Can_Modify_XCan_Not_Modify_X。您x不能通过此引用访问或修改数据成员。如果你将这个派生类指针向上转换为指向类的指针,A你突然可以修改数据成员x。通过设为x私有,您违反了 Liskov 替换原则。x是数据成员、成员函数还是类型定义都没有关系。你违反了 Liskov 替换,纯粹而简单。

派生类不应隐藏父类提供的功能。

于 2012-12-04T23:48:36.717 回答
0

这是一个主观的问题,所以我的回答也相应地是主观的。

我要说不,这不合理。protected属性使子类很容易意外地改变状态并违反不变量,因此我建议完全避免它们。然后,您的父类将x通过其公共或受保护的接口进行维护(希望通过一组有意义的方法,而不仅仅是修改器)。

然后,您无需更改子项的可访问性,因为您的界面已经适当地控制了访问。

不仅如此,更改成员或方法的可访问性违反了最小意外原则,并且很可能会给您未来的维护者带来问题。

于 2012-12-04T23:06:46.687 回答
0

您希望以下代码做什么?

A * a = new Can_Not_Modify_X();
a->setX(10);
于 2012-12-04T22:41:56.777 回答