c++ - 在实现抽象类的类中定义额外的实现特定函数

标签 c++ abstract-class abstract abstraction

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

在实现抽象类的类中创建额外的函数是不好的做法吗? 我知道我可以将它添加到抽象类中,让它在不使用它的类中什么也不做,但如果我有很多其他类,它在其中就没有用了,这似乎很糟糕。

最佳答案

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 ()编辑。对于正在处理 Berry 对象的用户来说,这将是不必要的。

Eat()Kiwi之前,您应该先Peel(),所以任何正在处理Kiwi 对象将期望 Peel() 函数可用,因此 Peel() 他们的 Kiwi 在他们 Eat 之前() 它。

现在假设用户被蒙上眼睛并得到一个 Fruit* someFruit 指针。他们不知道是浆果还是奇异果,但他们肯定可以尝试{ Eat(); 无论如何,因为吃水果总是有意义的!如果 Fruit 实际上是一个 Kiwi 而他们没有先对它进行Peel() 那么最好是 Kiwi::Eat() 函数抛出异常(throw "yuk!")或优雅地处理这种意外使用。

虽然这个例子是专门针对吃水果而写的,但我们通常可以假设一个对象的用户只要知道它的类型就知道该对象可以使用哪些功能。当用户不知道对象的类型时,最好进行一些错误检查以处理其函数被错误使用的情况。

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

相关文章:

Java抽象类包含一个map变量,子类使用不同的实现初始化map

c++ - Visual Studio 发布中令人费解的 STL 错误

c++ - 模板和抽象类

java - 使用哪种模式来避免对象值转换器的代码重复

C# 抽象类泛型属性

Java派生类不会自动创建实例

java - 如何在抽象方法中给出不同的参数?

c++ - 将字符串映射到 [0,100] 范围内的随机数的算法

c++ - 构造函数模板特化给出了对析构函数的 undefined reference

c++ - 在 C++ 中选择 vector 索引的有效方法