我有一堆实现接口的数据类,我们称之为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
中发生的事件,具体取决于&#39 ; s实施ISpendable
。
所以一个天真的方法可能是:
if(cost is Money) location.moneyBank.AmountChanged += OnAmountChanged;
else if (cost is Time) location.timeBank.AmountChanged += OnAmountChanged;
但我宁愿避免这种设置,因为我可能想要添加更多类型的信息。
我看来,我需要定义.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;
但这并不比原来的天真方法好得多。
有什么建议/想法吗?
答案 0 :(得分:1)
根据@Oxald的建议,我重构了一些事情以解决这个问题。
关键是只需将以下方法添加到ISpendable接口,但是:
IBank GetRelatedBank(Location location);
这样Time可以返回本地TimeBank,Money可以返回本地MoneyBank等。
通过让所有可以购买的对象实现IPurchasable接口,我可以稍微解决能够在TimeBank上花钱的问题,这可以确保该对象的每个ISpendable(成本)都调用正确银行实际进行支出。可以通过更改IBank接口来接受类型T(其中T:ISpendable),然后明确说明每个库中接受的类型,例如
public class MoneyBank : IBank<Money> {}
但尚未对其进行测试以确保其有效。