C++ 在实现抽象类的类中定义额外的特定于实现的函数
假设我正在使用函数eat()创建一个抽象类Fruit,我想让几个不同的类实现它。但是,对于Kiwi类,我还想创建一个函数peel(),它没有在我的抽象类中定义 在实现抽象类的类中生成额外函数是一种不好的做法吗? 我知道我可以将它添加到抽象类中,让它在不使用它的类中不做任何事情,但是如果我有很多其他类,它在其中就没有用处了 在实现抽象类的类中生成额外函数是一种不好的做法吗 一点也不 假设我们有以下类别:C++ 在实现抽象类的类中定义额外的特定于实现的函数,c++,abstract-class,abstract,abstraction,C++,Abstract Class,Abstract,Abstraction,假设我正在使用函数eat()创建一个抽象类Fruit,我想让几个不同的类实现它。但是,对于Kiwi类,我还想创建一个函数peel(),它没有在我的抽象类中定义 在实现抽象类的类中生成额外函数是一种不好的做法吗? 我知道我可以将它添加到抽象类中,让它在不使用它的类中不做任何事情,但是如果我有很多其他类,它在其中就没有用处了 在实现抽象类的类中生成额外函数是一种不好的做法吗 一点也不 假设我们有以下类别: 类水果 { 公众: virtual void Eat()=0;//纯虚拟函数使类抽象 } 浆果
类水果
{
公众:
virtual void Eat()=0;//纯虚拟函数使类抽象
}
浆果类:公共水果
{
公众:
void Eat()重写
{/*吃浆果…*/}
}
猕猴桃类:公共水果
{
公众:
void Eat()重写
{/*吃猕猴桃…*/}
void Peel()
{/*剥猕猴桃…*/}
}
我们当然可以吃()我们遇到的任何水果
,所以所有水果
物体都可以吃是有道理的
在食用之前,你不会Peel()
aBerry
,因此不期望Berry
可以Peel()
ed。这对于以任何方式处理Berry
对象的用户来说都是不必要的
在Eat()
ing一个Kiwi
之前,你应该先Peel()
它,所以任何处理Kiwi
对象的人都会期望Peel()
函数可用,因此Peel()
他们的Kiwi
在Eat()
之前
现在,让我们假设用户被蒙上眼睛,并给出一个Fruit*someFruit
指针。他们不知道这是浆果还是猕猴桃,但无论如何,他们肯定可以试试吃,因为吃水果总是有意义的!如果水果
实际上是一个猕猴桃
,而他们没有Peel()
,那么最好让Kiwi::Eat()
函数抛出一个异常(抛出“yuk!”
),或者优雅地处理这个意外用法
虽然这个例子是专门写的关于吃水果的,但我们通常可以假设,一个对象的用户只需知道它的类型,就知道该对象可以使用哪些函数。当用户不知道对象的类型时,最好执行一些错误检查来处理错误使用的函数。
在实现抽象类的类中创建额外的函数
不,这不是一个坏做法,而且是一件很自然的事<代码>将它添加到抽象类中,然后让它在不使用它的类中不做任何事情这(通常)是一种糟糕的做法;您可以看到它的一些示例,例如java中的迭代器:所有迭代器都有方法remove
,这在许多情况下都没有实现。更好的方法是使用迭代器和可变迭代器(带有remove),就像Kotlin那样。