Как перенести коды интерфейса Java в абстрактный базовый класс C ++? - PullRequest
1 голос
/ 08 октября 2010

Я новичок в программировании ООП и C ++, и я в настоящее время изучаю шаблоны проектирования.

Просто возьмите книгу Head First Design Patterns, чтобы извлечь уроки.Это действительно здорово, и я уже знакомлюсь с основными понятиями. В первой главе рассказывается о программировании интерфейса, а не о реализации.К сожалению для меня, хотя в примерах используется java.

Ниже приведен пример кода java из книг, использующих «интерфейс», я понимаю, что это нельзя напрямую перенести в C ++.Я пытался реализовать абстрактный базовый класс C ++.Но я потерялся, особенно в динамической установке QuackBehavior.

Может ли определение виртуальных функций C ++ быть динамическим?Может кто-нибудь показать мне, как наилучшим образом перенести этот код Java в C ++?Мне нужно это, чтобы быть уверенным, что я на правильном пути в изучении ООП.Спасибо!

//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();
    }
}

Ответы [ 4 ]

1 голос
/ 08 октября 2010

Если метод Quack() объявлен как чисто виртуальный в абстрактном базовом классе QuackBehavior, то все должно быть хорошо.

Ссылка на базовый класс ожидается в методе SetQuackBehavior(), который, очевидно, может содержать любой из объектов своего производного класса. То же самое можно применить в C ++, используя указатель на класс QuackBehavior в методе SetQuackBehavior(), а затем передать ему адрес объекта класса Squeak. Теперь, когда quack() метод вызывается в PerformQuack() через указатель базового класса, он вызывает соответствующий конкретный метод производного класса, в данном случае Squeak.

1 голос
/ 08 октября 2010

Данг - должен был знать, что первая банда отправит его в портВ любом случае вот одно решение:

   // 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;
   }
1 голос
/ 08 октября 2010

Пример кода C ++ для head-first

Для версии Java или C # проверьте сайт headfirstlabs.com

0 голосов
/ 08 октября 2010

Вот перевод грубый - просто предупреждаем, что это не кажется мне идиоматическим (или хорошим) использованием C ++:

#include <iostream>

struct FlyBehavior {
    virtual void operator()() const = 0; 
};

struct FlyWithWings: FlyBehavior {
    virtual void operator()() const { std::cout << "I'm flying!\n"; }
};

struct QuackBehavior {
    virtual void operator()() const = 0;
};

struct Quack : QuackBehavior {
    virtual void operator()() const { std::cout << "Quack\n"; }
};

struct Squeak : QuackBehavior {
    virtual void operator()() const { std::cout << "Squeak\n"; }
};

struct MuteQuack : QuackBehavior {
    virtual void operator()() const { std::cout << ("<<SILENCE>>\n"); }
};

class Duck {
    FlyBehavior const *flyBehavior;
    QuackBehavior const *quackBehavior;
public:
    Duck(FlyBehavior const *f, QuackBehavior const *q) :
        flyBehavior(f), quackBehavior(q)
    {}

    void setQuackBehavior(QuackBehavior *q) { quackBehavior = q; }
    void setFlyBehavior(FlyBehavior *f) { flyBehavior = f; }
    virtual void display() const = 0;
    void fly() const { (*flyBehavior)(); }
    void quack() const { (*quackBehavior)(); }
    void swim() const { std::cout << "All ducks float, even decoys\n"; }
};

struct MallardDuck : Duck {
    MallardDuck() : Duck(&FlyWithWings(), &Quack()) { }
    virtual void display() const { std::cout << "I'm a real Mallard duck\n"; }
};

int main() {
    MallardDuck mallard;
    mallard.setQuackBehavior(&Squeak());
    mallard.quack();
    mallard.fly();
    return 0;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...