Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将超类转换为特定的派生类型_C#_Java_Oop_Design Patterns_Inheritance - Fatal编程技术网

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

C# 将超类转换为特定的派生类型,c#,java,oop,design-patterns,inheritance,C#,Java,Oop,Design Patterns,Inheritance,我有一个名为Transaction的超类的继承层次结构。我在我的一个类中使用它作为变量,但在将它转换为特定类型时遇到困难,例如GameTransaction,ScienceTransaction等 每个特定类型都有特定的属性,因此我必须通过typeof检查它是否为该类型,然后将其强制转换为if。。else if..依此类推,具体取决于事务的派生类数量 这很烦人。还有别的办法吗?是否有这种设计模式?如果方法接受事务参数,则该方法中的行为应处于该级别。如果该方法使用的数据可能与GameTransat

我有一个名为
Transaction
的超类的继承层次结构。我在我的一个类中使用它作为变量,但在将它转换为特定类型时遇到困难,例如
GameTransaction
ScienceTransaction

每个特定类型都有特定的属性,因此我必须通过
typeof
检查它是否为该类型,然后将其强制转换为
if。。else if..
依此类推,具体取决于
事务的派生类数量


这很烦人。还有别的办法吗?是否有这种设计模式?

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

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

如果一个方法需要
GameTransaction
,则必须向其传递
GameTransaction

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

如果您真的有可以处理任何类型事务的方法(也就是说,泛型方法),那么
transaction
必须为这些方法公开足够的信息


例如,如果一个方法应该检查事务的启动时间,那么您必须有一个类似于
Transaction.startTime()
的方法,而不仅仅是
GameTransaction.startTime()

如果一个方法需要
GameTransaction
,则必须向其传递
GameTransaction

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

如果您真的有可以处理任何类型事务的方法(也就是说,泛型方法),那么
transaction
必须为这些方法公开足够的信息

例如,如果一个方法应该检查事务启动的时间,那么您必须有一个类似于
Transaction.startTime()
的方法,而不仅仅是
GameTransaction.startTime()

我的超类事务正在facade(design pattern)类中使用,因此每当有方法或服务涉及或需要转换为特定类型时,我都会遇到If。。否则。。否则,如果。。。。选中然后强制转换为特定类型以访问该属性或属性

是的。。这就是使用facade模式时的问题。您需要对客户端代码执行额外的强制转换

考虑在你的门面上使用

public class Facade
{
    public Transaction GetTransaction<T>() where T : Transaction
    {
        // any other process
        return (T)result;
    }
}
公共类Facade
{
公共事务GetTransaction(),其中T:Transaction
{
//任何其他过程
返回(T)结果;
}
}
只需在客户端代码上调用它:

GameTransaction gameTx = facadeInstance.GetTransaction<GameTransaction>();
GameTransaction gameTx=facadeInstance.GetTransaction();
facade模式的另一个选项是使用依赖项注入。因此,您提供了一个用于创建对象及其依赖关系的系统,而不是创建一个在每个代码上共享的大型类。这将是一个很长的故事来解释:)

我的超类事务正在facade(design pattern)类中使用,因此每当有方法或服务涉及或需要转换为特定类型时,我都会遇到If。。否则。。否则,如果。。。。选中然后强制转换为特定类型以访问该属性或属性

是的。。这就是使用facade模式时的问题。您需要对客户端代码执行额外的强制转换

考虑在你的门面上使用

public class Facade
{
    public Transaction GetTransaction<T>() where T : Transaction
    {
        // any other process
        return (T)result;
    }
}
公共类Facade
{
公共事务GetTransaction(),其中T:Transaction
{
//任何其他过程
返回(T)结果;
}
}
只需在客户端代码上调用它:

GameTransaction gameTx = facadeInstance.GetTransaction<GameTransaction>();
GameTransaction gameTx=facadeInstance.GetTransaction();

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

听起来像是一个设计问题。将通用
事务
s上的代码与
游戏事务
等上的代码分开。更具体代码的调用方应该知道它正在处理的事务类型。当然,如果看不到你想要完成什么,很难确定。为什么你要用
c
java
来标记它?你用的是哪一种?谢谢,伙计们,我用的是c语言,但如果java程序员有这样的经历,至少。。Griffey my super class事务正在我的facade(设计模式)类中使用,因此每当有方法或服务涉及或需要转换为特定类型时,我都会遇到If。。否则。。否则,如果。。。。检查然后强制转换到特定类型以以任何其他方式访问该属性或属性?听起来像是设计问题。将通用
事务
s上的代码与
游戏事务
等上的代码分开。更具体代码的调用方应该知道它正在处理的事务类型。c的