假设我正在创建一个带有Eat()函数的抽象类Fruit,我想创建一些实现它的不同类。但是,对于Kiwi类,我还想创建一个在我的抽象类中未定义的函数peel()。

在实现抽象类的类中增加额外的功能是否不好?
我知道我可以将其添加到抽象类中,而在不使用它的类中使其不执行任何操作,但如果我有很多其他类,这似乎就不好用了。

最佳答案

在实现抽象类的类中增加额外的功能是否不好?


一点也不!

假设我们有以下类别:

class Fruit
{
public:
    virtual void Eat() = 0;    // pure virtual functions make the class abstract
}

class Berry : public Fruit
{
public:
    void Eat() override
    { /* eat the berry... */ }
}

class Kiwi : public Fruit
{
public:
    void Eat() override
    { /* eat the kiwi... */ }

    void Peel()
    { /* peel the kiwi... */ }
}


当然,我们遇到的任何Eat()都可以Fruit,因此可以食用所有Fruit对象是有意义的。

在吃之前,您不会Peel()一个Berry,因此不会期望Berry被使用。无论如何,对于正在处理Peel()对象的用户来说,这是不必要的。

Berry编写Eat()之前,您应该先Kiwi它,所以任何正在处理Peel()对象的人都希望Kiwi功能可用,因此在使用Peel()之前先Peel() Kiwi它。

现在,假设用户被蒙住了眼睛并赋予了Eat()指针。他们不知道它是Fruit* someFruit还是Berry,但是他们肯定可以Kiwi,因为吃水果总是很有意义的!如果try { Eat(); }实际上是Fruit并且他们没有首先Kiwi,那么最好让Peel()函数抛出异常(Kiwi::Eat())或适当地处理这种意外的用法。

尽管此示例是专门针对吃水果编写的,但我们通常可以假定对象的用户将仅通过了解对象的类型即可知道该对象有哪些功能。当用户不知道对象的类型时,最好进行一些错误检查以处理其使用不正确的功能。

关于c++ - 在实现抽象类的类中定义额外的实现特定的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56452801/

10-13 00:08