我有一堆实现接口的数据类,我们称它为ISpendable
。根据ISpendable
运行时处理的类,控制器类需要设置不同的事件侦听器。
例:
public class Money : ISpendable {}
public class Time : ISpendable {}
public class Location { public MoneyBank moneyBank; public TimeBank timeBank; }
public class MoneyBank : IBank{
//...
public void Spend(ISpendable money);
}
public class TimeBank L IBank {
//...
public void Spend(ISpendable time);
}
public class CostDisplay() {
public CostDisplay(Location location, ISpendable cost) {}
}
现在,我要执行的操作CostDisplay()
是订阅发生在特定事件中的事件,TimeBank
并且/或者MoneyBank
取决于所实现的类ISpendable
。
因此,一个幼稚的方法可能是:
if(cost is Money) location.moneyBank.AmountChanged += OnAmountChanged;
else if (cost is Time) location.timeBank.AmountChanged += OnAmountChanged;
但是我宁愿避免这种设置,因为我可能想添加更多类型的ISpendable。
我需要的话,它的出现,是定义.moneyBank
里面引用Money
类,而.timeBank
内部参考Time
类,这样我可以做这样的事情:
location.<cost.DynamicallyStoredBankType>.AmountChanged += OnAmountChanged
看来我可以使用Invoke来实现类似的功能,但据我所知,这涉及使用字符串解析,随着代码库规模的增加,字符串解析似乎很杂乱且可能存在问题。
也许我应该以更简单的方式去?例如,将分别存储typeof(MoneyBank)
在Money
和typeof(TimeBank)
中Time
,然后路由到例如Location
-内的正确银行。
if (type is typeof(TimeBank)) return timeBank;
if (type if typeof(MoneyBank)) return moneyBank;
但这并不比原始的幼稚方法好多了。
有什么建议/想法吗?
遵循@Oxald的建议,我将内容进行了一些重构以解决此问题。
关键是要将以下方法简单地添加到ISpendable接口,但是:
IBank GetRelatedBank(Location location);
这样,Time可以返回本地的TimeBank,Money可以返回本地的MoneyBank,等等。
通过让所有可以购买的对象都实现一个IPurchasable接口,我可以解决在TimeBank上花钱的问题,该接口可以确保该对象的每个ISpendable(成本)都调用正确的银行以实际执行花费。可以通过更改IBank接口以接受其中T为ISpendable的类型T,然后在每个银行中显式声明接受的类型来加强这一点,例如
public class MoneyBank : IBank<Money> {}
但是尚未测试以确保此功能有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句