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的