我必须设计一个类的层次结构,例如:
func applicationDidEnterBackground(application: UIApplication)
{
UIApplication.dismissOpenAlerts()
}
我可以选择是否像这样实现它们:
class Animal{
speak();
name();
toString();
...
}
class Dog : public Animal {
...;
}
或者,在指向函数和lambdas的指针中运行......像这样:
class Animal{
virtual speak() = 0;
virtual name() = 0;
virtual toString() = 0 ;
...
}
class Dog : public Animal {
speak(){ ... }
name(){ ... }
toString(){ ... }
}
但是,在第二种情况下,基类不是抽象的,我不确定这是个好主意...... 第二种情况是非常无用的实施吗? 你能解释一下为什么吗?
答案 0 :(得分:0)
您正在寻找以下方法之间的选择:
第一种方法
class Animal{
virtual speak() = 0;
...
};
class Dog : public Animal {
speak(){ ... }
...
};
第二种方法
class Animal{
speak( s(); );
...
protected:
std::function<...> s();
...
};
class Dog : public Animal {
Dog(){
s() = ...;
...
}
};
首选方法。
在第二种方法中,您正在实现您的虚拟函数调度版本,而不是让编译器为您执行此操作。
答案 1 :(得分:0)
第二种方法允许在运行中更改对象的行为。例如。你可以改变动物说话的方式(甚至在你实例化一个物体之后)。如果这就是你所拥有的,那么你是否需要为动物分开课程甚至是个问题。只需创建一个工厂。
如果你不需要这种灵活性,那肯定是一种过度杀伤并增加了复杂性,你应该只使用虚拟方法。