Как мне перестать кастовать в этом сценарии? - PullRequest
3 голосов
/ 20 декабря 2011

У меня есть следующие действия:

abstract class AAction
{}

class BlueAction: AAction
{
    void Foo1(){// do stuff}
    void Foo2(){// do stuff}
}

и плагины, которые должны содержать действие:

class APlugin
{
    AAction _action;

    APlugin(AAction action)
    {
        _action = action;
    }

}

class BluePlugin: APlugin
{
    BluePlugin(): base(new BlueAction());
    {
    }

    voif Foo()
    {
        // do stuff with BlueAction's methods
        ((BlueAction)_action).Foo1();
        ((BlueAction)_action).Foo2();
    }
}

Я пытаюсь приспособить этот дизайн к шаблону дизайна, безудачи.

Я просто хочу заставить производные классы из APlugin иметь AAction

Я мог бы просто сделать это:

BlueAction act = (BlueAction)_action;
act.Foo1();
act.Foo2();

Использование обобщений(как предложено) не позволяет мне иметь список APlugins, который мне действительно нужен.

Но для меня это не разрешено.Есть идеи?

Ответы [ 3 ]

14 голосов
/ 20 декабря 2011

Используйте дженерики:

class APlugin<TAction> where TAction : AAction
{
    TAction _action;

    APlugin(TAction action)
    {
        _action = action;
    }

}

class BluePlugin: APlugin<BlueAction>
{
    BluePlugin(): base(new BlueAction());
    {
    }

    void Foo()
    {
        // do stuff with BlueAction's methods
        _action.Foo1();
        _action.Foo2();
    }
}
1 голос
/ 24 декабря 2011

Просто сохраните экземпляр BlueAction:

class APlugin
{
    AAction _action;

    APlugin(AAction action)
    {
        _action = action;
    }
}

class BluePlugin: APlugin
{
    BlueAction _blueAction = new BlueAction();

    BluePlugin(): base(_blueAction) 
    { 
    }

    void Foo()
    {
        // do stuff with BlueAction's methods
        _blueAction.Foo1();
        _blueAction .Foo2();
    }
}
1 голос
/ 21 декабря 2011

Если вы хотите, чтобы конструкторы оставались неизменными, вы можете сделать это следующим образом:

class APlugin
{
    public AAction Action { get; private set; }

    APlugin(AAction action)
    {
        Action = action;
    }

}

class BluePlugin: APlugin
{
    private ActualAction
    {
        get { return Action as BlueAction; }
    }

    BluePlugin(): base(new BlueAction());
    {
    }

    void Foo()
    {
        // do stuff with BlueAction's methods
        ActualAction.Foo1();
        ActualAction.Foo2();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...