在实现抽象 class 的 class 中定义额外的实现特定函数

Defining extra implementation specific functions in a class implementing an abstract class

假设我正在创建一个带有 eat() 函数的抽象 class Fruit,我想制作一些不同的 classes 来实现它。但是,对于 class Kiwi,我还想创建一个函数 peel() ,它没有在我的摘要 class.

中定义

在实现抽象 class 的 class 中创建额外的函数是不好的做法吗? 我知道我可以将它添加到摘要 class 并且让它在不使用它的 classes 中什么都不做,但如果我有很多其他 class 似乎很糟糕es它不会有用的。

Is it bad practice to make extra functions in a class implementing an abstract class?

完全没有!

假设我们有以下类:

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()ed。这对于处理 Berry 对象的用户来说是不必要的。

Eat()ing a Kiwi 之前你应该先 Peel() 它,所以任何处理 Kiwi 对象的人都会期待 Peel()功能可用,因此 Peel() 他们 Kiwi 在他们 Eat() 之前。

现在假设用户被蒙上眼睛并得到一个 Fruit* someFruit 指针。他们不知道是 Berry 还是 Kiwi 但他们肯定 try { Eat(); } 因为吃水果总是有意义的!如果 Fruit 实际上是一个 Kiwi 而他们首先没有 Peel() 那么让 Kiwi::Eat() 函数抛出异常是个好主意(throw "yuk!" ) 或优雅地处理这种意外使用。

虽然这个例子是专门写的关于吃水果的,但我们通常可以假设一个对象的用户只要知道它的类型就知道该对象有哪些功能。当用户不知道对象的类型时,实现一些 error-checking 来处理其功能被错误使用是个好主意。