我有一个继承层次结构,其中有一个名为Transaction
. 我在我的一个类中将它用作变量,但我无法将其转换为特定类型,例如GameTransaction
等ScienceTransaction
。
每个特定类型都有特定的属性,所以我必须通过typeof
然后转换它来检查它是否是那个类型,所以我最终会得到If.. else if..
等等,这取决于有多少派生类 for Transaction
。
这很烦人。有没有其他方法可以解决这个问题?有什么设计模式吗?
我有一个继承层次结构,其中有一个名为Transaction
. 我在我的一个类中将它用作变量,但我无法将其转换为特定类型,例如GameTransaction
等ScienceTransaction
。
每个特定类型都有特定的属性,所以我必须通过typeof
然后转换它来检查它是否是那个类型,所以我最终会得到If.. else if..
等等,这取决于有多少派生类 for Transaction
。
这很烦人。有没有其他方法可以解决这个问题?有什么设计模式吗?
如果一个方法接受 Transaction 的参数,则该方法中的行为应该处于该级别。如果该方法使用的数据在 GameTransaction、ScienceTransaction 等上可能不同,则该数据必须可通过事务级别的访问方法获得。每个专业化都可以覆盖该访问方法并相应地提供该附加数据。
如果一个方法需要一个GameTransaction
,你必须给它传递一个GameTransaction
。
传入类型变量Transaction
并将其转换GameTransaction
为糟糕的设计 - 很难理解,也是编程错误的根源:如果您不小心传递了错误的类型,编译器将无法为您发现这一点。
如果您确实有应该适用于任何类型事务的方法(可以说是通用方法),那么Transaction
必须为这些方法公开足够的信息。
例如,如果一个方法应该检查事务何时开始,那么你必须有一个类似的方法Transaction.startTime()
,而不仅仅是GameTransaction.startTime()
.
我的超类事务正在我的外观(设计模式)类中使用,因此每次有涉及或需要转换为特定类型的方法或服务时,我都会遭受 If.. Else IF.. Else IF.... 检查然后转换特定类型以访问该属性或属性
是的..这是使用外观模式时的问题。您需要对客户端代码进行额外的转换。
考虑在你的门面上使用Generic
public class Facade
{
public Transaction GetTransaction<T>() where T : Transaction
{
// any other process
return (T)result;
}
}
只需在客户端代码上调用它:
GameTransaction gameTx = facadeInstance.GetTransaction<GameTransaction>();
外观模式的另一个选择是使用依赖注入。因此,与其创建一个在每个代码上共享的大类,不如提供一个用于创建对象及其依赖项的系统。这将是一个很长的故事来解释:)