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字段。他们可能会把它传给基地,然后从那里继续施放。