我是 OOP 编程和 C++ 的新手,目前正在学习设计模式。
只需拿起 Head First Design Patterns 一书即可学习。它实际上很棒,我已经掌握了基本概念。第一章讨论的是针对接口(interface)而不是实现进行编程。不过对我来说不幸的是,这些示例使用了 java。
以下是使用“接口(interface)”的书籍中的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();
}
}
最佳答案
Dang - 早该知道 head first gang 会移植它。无论如何,这是一个解决方案:
// HeadFirst.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
class QuackBehavior
{
public:
virtual void quack() = NULL;
};
class Quack : public QuackBehavior
{
public:
void quack()
{
printf("Quack");
}
};
class Squeak : public QuackBehavior
{
public:
void quack()
{
printf("Squeak");
}
};
class Duck
{
public:
QuackBehavior *pQuack;
void performQuack()
{
if (pQuack!=NULL)
pQuack->quack();
}
void setQuackBehavior(QuackBehavior *qb)
{
pQuack = qb;
}
};
class MallardDuck : public Duck
{
public:
MallardDuck()
{
pQuack = new Quack();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Duck *mallard = new MallardDuck();
mallard->setQuackBehavior(new Squeak());
mallard->performQuack();
return 0;
}
关于java - 如何将Java接口(interface)代码移植到C++抽象基类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3887702/