1

我有一个继承层次结构,其中有一个名为Transaction. 我在我的一个类中将它用作变量,但我无法将其转换为特定类型,例如GameTransactionScienceTransaction

每个特定类型都有特定的属性,所以我必须通过typeof然后转换它来检查它是否是那个类型,所以我最终会得到If.. else if..等等,这取决于有多少派生类 for Transaction

这很烦人。有没有其他方法可以解决这个问题?有什么设计模式吗?

4

3 回答 3

1

如果一个方法接受 Transaction 的参数,则该方法中的行为应该处于该级别。如果该方法使用的数据在 GameTransaction、ScienceTransaction 等上可能不同,则该数据必须可通过事务级别的访问方法获得。每个专业化都可以覆盖该访问方法并相应地提供该附加数据。

于 2013-11-14T17:23:44.530 回答
0

如果一个方法需要一个GameTransaction,你必须给它传递一个GameTransaction

传入类型变量Transaction并将其转换GameTransaction为糟糕的设计 - 很难理解,也是编程错误的根源:如果您不小心传递了错误的类型,编译器将无法为您发现这一点。

如果您确实有应该适用于任何类型事务的方法(可以说是通用方法),那么Transaction必须为这些方法公开足够的信息。

例如,如果一个方法应该检查事务何时开始,那么你必须有一个类似的方法Transaction.startTime(),而不仅仅是GameTransaction.startTime().

于 2013-11-15T09:22:25.487 回答
0

我的超类事务正在我的外观(设计模式)类中使用,因此每次有涉及或需要转换为特定类型的方法或服务时,我都会遭受 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>();

外观模式的另一个选择是使用依赖注入。因此,与其创建一个在每个代码上共享的大类,不如提供一个用于创建对象及其依赖项的系统。这将是一个很长的故事来解释:)

于 2013-11-15T09:38:32.480 回答