专业面试的意外答案

时间:2017-01-17 15:57:42

标签: c++ oop polymorphism theory

这是一个100%的理论问题,也许是基于意见的。

在一次专业的采访中,我得到了一个印刷页面,其中包含大量写得很好且格式不正确的两个class es代码,用于逐行分析。我们称这些数据结构为AB。没有问题陈述或任何有关预期行为的信息。

然而他们的一个问题真的让我生气。

在确定算法的可疑行为以及许多潜在和实际错误后,他们要求我再确定一个错误。我发现了其他一些明显的问题,但我并没有弄清楚他们想要什么。好吧,当他们告诉我答案时,它引起了我的注意。 AB的简化版本如下(我只留下了他们想法中的方法):

template <typename T>
class A
{
public:

    // elements are dynamically allocated on the heap

    const T& getValue(unsigned i) const // I'm not even sure it was const
    {
        // return element at position 'i'
    }

    virtual void setValue(unsigned i, const T &value)
    {
        // sets the element at position 'i'
    }
};

template <typename T>
class B: public A<T>
{
public:

    virtual void setValue(unsigned i, const T &value)
    {
        // set the element at position 'i' using A<T>::setValue()
        // then sort all elements in descending order
    }
};

嗯,解决方案不是编译,运行时或逻辑错误。甚至没有潜在的风险。 错误如下:,因为B::setValue在您放置元素后对数据进行排序,您无法测试您在给定位置访问的数据是否与您在该给定位置存储的数据相同。但是使用A,您可以执行此操作。 AB之间的这种无与伦比的行为被视为错误(并且他们补充说这不是错误,但它是错误的。)

我认为它完全是一种设计选择(因为B的重点是维护已排序的数据),我不会说这是一个错误,特别是没有问题陈述或有关预期行为的任何信息。它甚至不违反多态性的概念或概念。

您会将其识别为错误吗?

1 个答案:

答案 0 :(得分:9)

我们可以决定它是类A的接口的一部分,更具体地说是A::getValue的后置条件,A::getValue必须返回相同的值(立即)先前由A::setValue分配到同一索引中。

如果指定了此类发布条件,则违反发布条件的派生类将违反Liskov Substitution Principle。这将是一个设计错误。

在练习中没有指明这种后置条件是否存在,或者是否应该存在。没有后置条件,没有设计错误(至少不是我正在讨论的错误)。

是否应该存在(可能是由你的访调员承担)后期条件应由层次结构的设计者决定。在你的面试中你是谁。后置条件是否为层次结构的良好设计将取决于类的建模。如果A建模类似于std::array - 这就像它的类似 - 那么在我看来,后期条件肯定是一个很好的设计选择。