假设我正在创建一个带有函数 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/