0

私は現在、このクラスを持っています:

ActivityActivityManager(拡張Activity)。

Activityのシングルトン オブジェクトを取得するメソッドが に 1 つありActivityManagerます。

しばらくすると、ActivityManager はコンパイラによってのみ「作成」されるため、「生命のない生活」のパラドックスに陥ったことがわかりました。では、どうすればこの種のことを行うことができますか?

つまり、最初のオブジェクトから拡張されたオブジェクトのクラスを取得するにはどうすればよいですか?

これをグーグルに載せる方法さえ知らないので、助けてください!ありがとう

編集

簡略化Activity

class Activity
{
public:
    void start();
};

void Activity::start(void){
    // Start current Activity on the ActivityManager Stack
    ActivityManager *am;
    am = ActivityManager::getInstance();
    am->start(this);
}

簡体字ActivityManager:

class ActivityManager: public Activity
{
private:
    // Singleton Object
    static ActivityManager *singleton;

public:
    // Singleton method to return defauld object instance
    static ActivityManager* getInstance(void);

    // Overload method, used to run others Activityes
    void start(Activity& activity);

};

// Singleton method to return default ActivityManager object instance
ActivityManager* ActivityManager::getInstance(){
    if(!singleton) singleton = new ActivityManager();

    return singleton;
}

// Function called on request to start new activity
void ActivityManager::start(Activity& activity){
}
4

1 に答える 1

0

Composite パターン ( http://en.wikipedia.org/wiki/Composite_pattern ) の方がニーズに適していると思います。

次のようなバリエーションになります (名前付けはパターンの点で少しねじれていますが、このようにコードに似ています):

class Activity
{
    public:
        virtual ~Activity();

        virtual void start();
        virtual void add(Activity*);
        virtual void remove(Activity*);

    private:
        Activity();
}



class ActivityManager : Activity
{
    public:
        ConcreteActivity();
        ~ConcreteActivity();

        void start();
        void add(Activity*);
        void remove(Activity*);

    private:
        list<Activity*> _activities;
}

void ActivityManager::start()
{
    list<Activity*>::const_iterator concreteActivity;

    for(concreteActivity = _activities.begin(), concreteActivity != _activities.end(); ++concreteActivity)
    {
        *concreteActivity->start();
    }
}

void ActivityManager::add(Activity* newActivity)
{
    _activities.push_back(newActivity);
}

void ActivityManager::remove(Activity* activityToDelete)
{
    _activities.remove(activityToDelete);
}




class SomeActivity : Activity
{
     public:
         SomeActivity();
         ~SomeActivity();

         void start();
}

class OtherActivity : Activity
{
     public:
         OtherActivity();
         ~OtherActivity();

         void start();
}

そして使用例:

ActivityManager* manager = new ActivityManager();

SomeActivity* activity_one = new SomeActivity();
OtherActivity* activity_two = new OtherActivity();

manager->add(activity_one);
manager->add(activity_two);
manager->start();

また、必要に応じて、ActivityManager をシングルトンにすることもできます。プロジェクトに関する追加情報がなければ、より良い方法は考えられません。

于 2013-03-25T01:42:34.460 に答える