C#如何动态转换对象
C# how to dynamically cast object
public class TriggerableObject
{
Trigger(){
DoSomething();
}
}
public class X : TriggerableObject
{
Trigger(){
DoSomethingElse();
}
}
public class X2 : TriggerableObject
{
Trigger(){
DoSomethingOther();
}
}
public class Trigger
{
TriggerableObject obj = FindMyObject();
obj.Trigger();
}
Class Trigger 从其他对象中找到 class X,但是当它调用 Trigger() 时,会调用基 class 中的方法 (DoSomething()
)。但是,我希望它从 class X (DoSomethingElse()
) 调用触发器,如果我将它转换为 class X,它会起作用。问题是我不知道是否找到了 class 将是 X 或 X2,因此如果我将其静态转换为 X,则它不适用于 X2。
我该怎么做?
您需要在基础 class 中覆盖该行为。您需要首先将基 class 中的方法标记为虚拟方法,然后在继承自基 class.
的所有 class 中重写该函数
public class TriggerableObject
{
public virtual Trigger(){
DoSomething();
}
}
public class X : TriggerableObject
{
public override Trigger(){
DoSomethingElse();
}
}
public class X2 : TriggerableObject
{
public override Trigger(){
DoSomethingOther();
}
}
public class Trigger
{
TriggerableObject obj = FindMyObject();
obj.Trigger();
}
请注意,如果您不想在基类中实现 class,您可以使用抽象方法
接口是你的朋友。如果您的代码中有一个特定的结构(正如您所拥有的)但实现不同,那么请考虑 interfaces。当然这并不总是答案,但您的上述示例可以按以下方式编写。
public interface ITriggerableObject
{
Trigger();
}
public class X : ITriggerableObject
{
Trigger(){
DoSomethingElse();
}
}
public class X2 : ITriggerableObject
{
Trigger(){
DoSomethingOther();
}
}
public class Trigger
{
ITriggerableObject obj = FindMyObject();
obj.Trigger();
}
语法可能不对,因为我没有编译它,但语义是可靠的。
public class TriggerableObject
{
Trigger(){
DoSomething();
}
}
public class X : TriggerableObject
{
Trigger(){
DoSomethingElse();
}
}
public class X2 : TriggerableObject
{
Trigger(){
DoSomethingOther();
}
}
public class Trigger
{
TriggerableObject obj = FindMyObject();
obj.Trigger();
}
Class Trigger 从其他对象中找到 class X,但是当它调用 Trigger() 时,会调用基 class 中的方法 (DoSomething()
)。但是,我希望它从 class X (DoSomethingElse()
) 调用触发器,如果我将它转换为 class X,它会起作用。问题是我不知道是否找到了 class 将是 X 或 X2,因此如果我将其静态转换为 X,则它不适用于 X2。
我该怎么做?
您需要在基础 class 中覆盖该行为。您需要首先将基 class 中的方法标记为虚拟方法,然后在继承自基 class.
的所有 class 中重写该函数public class TriggerableObject
{
public virtual Trigger(){
DoSomething();
}
}
public class X : TriggerableObject
{
public override Trigger(){
DoSomethingElse();
}
}
public class X2 : TriggerableObject
{
public override Trigger(){
DoSomethingOther();
}
}
public class Trigger
{
TriggerableObject obj = FindMyObject();
obj.Trigger();
}
请注意,如果您不想在基类中实现 class,您可以使用抽象方法
接口是你的朋友。如果您的代码中有一个特定的结构(正如您所拥有的)但实现不同,那么请考虑 interfaces。当然这并不总是答案,但您的上述示例可以按以下方式编写。
public interface ITriggerableObject
{
Trigger();
}
public class X : ITriggerableObject
{
Trigger(){
DoSomethingElse();
}
}
public class X2 : ITriggerableObject
{
Trigger(){
DoSomethingOther();
}
}
public class Trigger
{
ITriggerableObject obj = FindMyObject();
obj.Trigger();
}
语法可能不对,因为我没有编译它,但语义是可靠的。