C#编码模式问题
本文关键字:问题 模式 编码 | 更新日期: 2023-09-27 17:59:00
我有以下代码:
protected void Initialize(){
this.Fonts.Initialize();
this.Screens.Initialize();
this.Menu.Initialize();
}
protected void Update(){
this.Screens.Update();
this.Menu.Update();
}
写完这篇文章后,我将代码重新分解为:
protected void Initialize(){
this.CallMethod<INeedInitialization>(
(i) => { i.Initialize(); }
, this.Fonts, this.Screens, this.Menu
);
}
protected void Update(){
this.CallMethod<INeedUpdating>(
(i) => { i.Update(); }
, this.Screens, this.Menu
);
}
private void CallMethod<T>(Action<T> action, params T[] items){
items.ToList().ForEach(i => action(i));
}
然后,我意识到在我的代码库中,有很多对CallMethod<T>
类型操作的重用,所以我进一步考虑到:
public static extensions{
// I use object type as I can have INeedInitialization, INeedUpdate etc...
public static void CallMethod<T>(this object obj, Action<T> action,
params T[] items){
items.ToList().ForEach(i => action(i));
}
}
现在,我可以在所有我的对象上获得CallMethod<T>
,但不知何故,在这样做之后,我觉得这段代码有一些根本性的问题&无法指出为什么我觉得它不正确。
此外,我如何对泛型方法设置OR约束,以仅接受INeedUpdating
或INeedInitialize
类型的对象,而不是扩展基本Object
类型?
有人能帮忙吗?
谢谢!
KISS原理!
这似乎是幻想编码综合症的一个例子。我看不到从常规例程中获得任何好处,也看不到维护、调试和测试额外代码的巨大开销。
要回答您的问题,您可以创建两个函数副本,每个接口一个:
public static void CallMethod<T>(this INeedUpdating obj, Action<T> action,
params T[] items){
items.ToList().ForEach(i => action(i));
}
public static void CallMethod<T>(this INeedInitialize obj, Action<T> action,
params T[] items){
items.ToList().ForEach(i => action(i));
}
但我不得不怀疑,你的混乱局面是否真的比简单地说:更容易阅读
foreach(var item in new INeedInitialization[]{this.Fonts, this.Screens, this.Menu})
item.Initialize();
List<INeedInitialization> InitializedComponents = new List<INeedInitialization> {Fonts, Screens, Menus};
List<INeedUpdating> UpdatedComponents = new List<INeedUpdating> {Screens, Menus}
protected void Initialize(){
foreach(var i in InitializedComponents)
i.Initialize();
}
protected void Update(){
foreach(var u in UpdatedComponents)
u.Update();
}
这可以很好地成为复杂类层次结构的一部分,只需在不更改或覆盖方法本身的情况下向集合中添加更多项。