我有 3 个类:
class First {
public void SetA(){ ... }
public void SetB(){ ... }
public void SetC(){ ... }
public void SetD(){ ... }
public void SetZ(){ ... }
}
class Second {
public void SetC(){ ... }
public void SetD(){ ... }
public void SetE(){ ... }
public void SetF(){ ... }
public void SetX(){ ... }
}
class Third{
public void SetA(){ ... }
public void SetB(){ ... }
public void SetE(){ ... }
public void SetF(){ ... }
public void SetY(){ ... }
}
如您所见,我在相同的方法中复制了代码。
昨天我意识到有时我想在每个方法中添加另一个命令。
所以我正在寻找一种方法来解决这两个问题。我想到的一种解决方案是:
创建接口(interface):
interface IAllMethods { void SetA(); void SetB(); void SetC(); void SetD(); void SetE(); void SetF(); void SetX(); void SetY(); void SetZ(); }
创建默认实现:
class DefaultAllMethods { public void SetA(){ ... } public void SetB(){ ... } public void SetC(){ ... } public void SetD(){ ... } public void SetE(){ ... } public void SetF(){ ... } public void SetX(){ ... } public void SetY(){ ... } public void SetZ(){ ... } }
使用装饰器模式创建另一个实现以添加额外的命令:
class ExtraAllMethods { private IAllMethods _allMethods; public ExtraAllMethods (IAllMethods allMethods) { _allMethods=allMethods; } public void SetA(){ _allMethods.SetA(); extraMethod(); } public void SetB(){ _allMethods.SetB(); extraMethod(); } public void SetC(){ _allMethods.SetC(); extraMethod(); } .. .. .. }
在 First、Second 和 Third 类中使用愿望实现。例如:
class Third{ private IAllMethods _allMethods; public Third(IAllMethods allMethods) { _allMethods=allMethods; } public void SetA(){ _allMethods.SetA(); } public void SetB(){ _allMethods.SetB(); } .. .. .. }
您如何看待这个解决方案?有没有更好的设计来满足这个需求?
更新
人们要求真正的生意,所以这里是:
我有 3 种传输类型:TransmissionA、TransmissionB、TransmissionC
每个传输都有许多参数(成员或属性)。例如,TransmissionA 有 WorkerId、CustomerId、MessageName 等。 TransmissionB 有 WorkerId 和 MessageName 但没有 CustomerId。 TransmissionC 有 WorkerId、CustomerId 但没有 MessageName。这些仅是示例 - 在我的情况下,每个传输都有更多属性。每个属性都有 Set 方法。
现在有了新的需求。系统某处有一个名为“更新任务”的选项。如果该选项为 ON,那么我需要在每个 Set 方法中更新相关任务。这就是我想到装饰器模式的原因。
最佳答案
- 接口(interface)不是个好主意,因为它的实现者只为接口(interface)提供的方法的子集提供功能。
- decorator pattern这里不能用,因为是用来增加功能的,不能像增加方法那样用来改变API。参见 this answer了解更多信息。
- 如果您在不同的类中有相同的方法和相同的代码,则应将其提取到自己的类中供其他人使用。目前,您的类(class)很可能违反了 single responsible principle .
关于c# - 如何解决此代码重复+添加另一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984050/