java - 如何将Java接口(interface)代码移植到C++抽象基类中?

标签 java c++ design-patterns oop

我是 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/

相关文章:

android - BroadcastReceiver 应该在 Activity 中声明吗?

c++ - 如何使用指向指针的指针

c# - 不同域/项目中的相同界面

java饼图高度未正确放置

java - Java 中的随机数真的不可预测吗?

java - Gradle Sync 后 Android 项目结构发生变化

java - 如何在 IDEA 的设置中修改整个默认的 "try-catch"模板?

c++ - 悬空 if 和宏

c++ - 签名的二进制表示是否可以在体系结构之间移植?

asp.net-mvc-3 - 使用 EF 4.3 设计带有模块的 Web 平台