【发布时间】:2010-10-08 04:29:00
【问题描述】:
我是 OOP 编程和 C++ 方面的新手,我目前正在学习设计模式。
只需拿起 Head First Design Patterns 这本书来学习。它实际上很棒,我已经掌握了基本概念。第一章讨论了对接口而不是实现的编程。不过对我来说不幸的是,这些示例使用了 java。
下面是书中使用“接口”的java代码示例,我知道这不能直接移植到C++中。我试图实现 C++ 的抽象基类。但我尤其迷失在动态设置 QuackBehavior 方面。
C++ 虚函数定义可以是动态的吗?有人可以告诉我如何将此Java代码移植到C++中的最佳方法吗?我需要这个来确保我在学习 OOP 时走在正确的轨道上。谢谢!
//FlyBehavior.java
public interface FlyBehavior{
public void fly(); //the interface that all flying behavior classes implement
}
public class FlyWithWings implements FlyBehavior {
public void fly(){
System.out.println("Im flying!"); //flying behavior implementation for ducks that do fly
}
}
//QuackBehavior.java
public interface QuackBehavior{
public void quack();
}
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("Quack");
}
}
public class Squeak implements QuackBehavior {
public void quack() {
System.out.println("Squeak");
}
}
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("<<SILENCE>>");
}
}
//duck.java
public abstract class Duck{
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck(){
}
public abstract void display();
public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
public void setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb){
quackBehavior = qb;
}
public void swim(){
System.out.println ("All duck float, even decoys");
}
}
//MallardDuck.java
public class MallardDuck extends Duck{
public MallardDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display(){
System.out.println("Im a real Mallard duck");
}
}
//miniducksim.java
public class MiniDuckSimulator{
public static void main (String[] args){
Duck mallard = new MallardDuck();
mallard.setQuackBehavior(new Squeak()); // this is where im lost
//how can definition of a virtual functions in C++ be dynamic?
mallard.performQuack();
mallard.performFly();
}
}
【问题讨论】:
-
嘿,我也喜欢那本书,我只是假设它可以用抽象类来完成。你能发布你到目前为止所做的代码吗?似乎它应该是可能的。
-
我明白你的问题,但我想知道在这种情况下你对“动态”的定义是什么?
-
how can definition of a virtual functions in C++ be dynamic?那么,虚函数有什么用呢?这些确实是动态的。 -
@kuropenguin 和@Hemant:我的意思是可以在运行时更改之前定义的虚函数吗?
-
改变之前定义的虚函数是什么意思?看看我的回答,希望能解开你的疑惑。
标签: java c++ design-patterns oop