将超类转换为特定的派生类型

时间:2013-11-14 16:28:20

标签: c# java oop design-patterns inheritance

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

每个特定类型都有特定的属性,所以我必须通过typeof检查它是否是那个类型然后强制转换,所以我最终得到If.. else if..,依此类推,具体取决于那里有多少派生类适用于Transaction

这很烦人。还有其他方法吗?这个的任何设计模式?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果某个方法需要GameTransaction,则必须将其传递给GameTransaction

传入类型Transaction的变量并将其转换为GameTransaction是一个糟糕的设计 - 它很难理解,并且编程错误的来源:如果你不小心传递了错误的类型,编译器就不能发现这个给你。

如果你真的有适用于任何类型的事务的方法(通用方法,那么说),那么Transaction必须为这些方法提供足够的信息。

例如,如果某个方法应该检查转化何时开始,那么您必须拥有Transaction.startTime()之类的方法,而不仅仅是GameTransaction.startTime()

答案 2 :(得分:0)

  

我的超级事务正在我的门面(设计模式)类中使用,所以每次有涉及或要求转换为特定类型的方法或服务时,我都会遇到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>();

Facade模式的另一个选择是使用依赖注入。因此,您可以提供系统来创建对象及其依赖项,而不是创建一个共享每个代码的大类。这将是一个长篇故事来解释:)