【问题标题】:Converting super class to specific derived type将超类转换为特定的派生类型
【发布时间】:2013-11-14 16:28:19
【问题描述】:

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

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

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

【问题讨论】:

  • 听起来像是设计问题。将适用于通用Transactions 的代码与适用于GameTransaction 等的代码分开。更具体代码的调用者应该知道它正在处理的事务类型。当然,如果没有看到您要完成的工作,就很难确定。
  • 你为什么用c#java标记这个?你用的是哪个?
  • 感谢我使用 c# 的伙计们,但如果 java 程序员至少体验过这一点.. Griffey 我的超类事务正在我的外观(设计模式)类中使用,所以每次有方法或服务涉及或需要转换为特定类型我遭受 If.. Else IF.. Else IF.... 检查然后转换为特定类型以以任何其他方式访问该属性或属性?

标签: c# java oop design-patterns inheritance


【解决方案1】:

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

【讨论】:

  • 谢谢阿拉贡。所以你说如果我有一个方法:MyGameMethod 特定于 GameTransaction 类,我也应该把它放在抽象类 Transaction 中?因此,如果我说从 Transaction 继承的 4 个子类,我应该将每个类特定的所有方法作为抽象方法或虚拟方法放在基类中?这不会使基类变大吗?就像在许多方法中一样,有些方法可能对其他派生类型没有用,仅对特定的派生类型有用.. 比如 MyGameMethod.. 可以吗?
  • @user2080671:不,您只在Transaction 上提供适用于任何事务的方法。如果您需要一种仅在一种类型/子类事务上可用的方法,则该方法必须只接受该子类。
【解决方案2】:

如果方法需要GameTransaction,则必须将GameTransaction 传递给它。

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-14
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2013-11-17
      相关资源
      最近更新 更多