如何在这种情况下停止投射?

Ody*_*dys 3 c# inheritance design-patterns

我有以下行动:

abstract class AAction
{}

class BlueAction: AAction
{
    void Foo1(){// do stuff}
    void Foo2(){// do stuff}
}
Run Code Online (Sandbox Code Playgroud)

以及应包含操作的插件:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图将这种设计融入设计模式,没有运气.

我只想要强制派生类APlugin来拥有一个AAction

我可以做到这一点:

BlueAction act = (BlueAction)_action;
act.Foo1();
act.Foo2();
Run Code Online (Sandbox Code Playgroud)

使用泛型(如建议)不允许我有一个APlugins列表,这是我真正需要的.

但这对我来说是不行的.有任何想法吗?

Mag*_*tLU 14

使用泛型:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)