Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这个场景中,我如何停止施法?_C#_Design Patterns_Inheritance - Fatal编程技术网

C# 在这个场景中,我如何停止施法?

C# 在这个场景中,我如何停止施法?,c#,design-patterns,inheritance,C#,Design Patterns,Inheritance,我有以下行动: abstract class AAction {} class BlueAction: AAction { void Foo1(){// do stuff} void Foo2(){// do stuff} } 以及应该包含操作的插件: class APlugin { AAction _action; APlugin(AAction action) { _action = action; } } class

我有以下行动:

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
的派生类具有
aaaction

我可以这样做:

BlueAction act = (BlueAction)_action;
act.Foo1();
act.Foo2();
使用仿制药(如建议的)不允许我有一个我真正需要的APlugins列表

但这对我来说是不可能的。有什么想法吗?

使用泛型:

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();
    }
}
class APlugin,其中TAction:aaaction
{
战术行动;
APlugin(触觉作用)
{
_行动=行动;
}
}
类BluePlugin:APlugin
{
BluePlugin():base(新的BlueAction());
{
}
void Foo()
{
//用BlueAction的方法做事
_action.Foo1();
_action.Foo2();
}
}

假设您希望构造函数保持不变,可以按如下方式执行:

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

只需保留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();
    }
}

我想也许你想要
Foo1
Foo2
成为基类的抽象成员?那么您的调用站点就不需要强制转换,
\u action.Foo1()代码
类BlueAction:aaAction{void Foo1();void Foo2();}
未编译…@asawyer不,我希望BlueAction有自己的methods@RoyiNamir代码仅供演示,不是从我的项目中复制的。我的问题是关于设计和找不到错误:)代码
类BlueAction:aaAction{void Foo1();void Foo2();}
没有编译-他不能在类中有非抽象方法或没有主体的函数。。。。这个问题没有被理解,我假设Foo1和Foo2都有身体,但为了清楚起见,它们只是被省略了。忘了提到我想要一个海狸鼠的列表!!!我真的很抱歉!否则,您的解决方案就是我之前评论的greatA解决方案::p我相信我的问题现在已经解决了!对另一个问题的答案可能是你能做到的最接近的。它仍然受到限制,因为您的列表不局限于只包含APlugin实例,而是包含新的虚拟基类。这可能不是什么大问题,完全在您的控制之下,大概没有其他虚拟基类的实现,但仍然是一个限制。同样,这个伪基类应该是一个接口。您不打算在其中包含任何实现(大概是这样)。\u action和\u blue action应该是一个。如果我将一个属性设置为action,它将不会出现在_blueAction实例中。你说的是糟糕的设计。不,不是。它们是同一个对象,只有两个引用。但情况是一样的。这与示例中显示的相同,但将引用保留在字段中。我猜你在说它们不一样,这是一个糟糕的设计之前没有试过…实际上我没有注意到BlueAction构造函数中的参数…:p我喜欢你的方法。我不喜欢有两个实例,它们可能会让未来的开发人员感到困惑。你不会有两个实例,只有一个!如果您未来的开发人员可能对此感到困惑,那么您需要更好的开发人员。这是c#的基础。我只关心一个事实,即开发人员不会被迫在类中添加blueAction字段。他们可能会把它传给基地,然后从那里继续施放。