转换为运行时类型

时间:2014-06-24 14:43:52

标签: c# design-patterns abstract-class

这是我的结构:

Abstract Class - Action
--Abstract Class - ConfigsAction
---- ResetAction
---- SetToZeroAction
--Abstract Class - SettingsAction
---- EditLanguageAction
---- ChangeColorPrefAction

ManagerAccessPoint.Receive(动作动作)

ManagerAccesPoint接收操作并将其“发送”到适当的ConcreteManager。 因此ManagerAccessPoint需要将其投射到ConfigsAction或SettingsAction 然后,ConfigManager / SettingsManager会将其转换为正确的动作类,如果它是ResetAction,SetToZeroAction,EditLanguageAction或ChangeColorPrefAction。

我知道我可以用

保存动作类型
Object.getType().name 

作为一个字符串。 我知道我可以通过

从字符串中获取类型
Type­.GetType(string)

但是如何将它重新投入到那种类型?它可以看作是这样:

Retrievetype derievedAction =  (RetrieveType)myAction

其中retrieveType是Type变量

我发现了其他“类似”的问题,但没有人给我一个解决我情况的工作方案。

一旦我收到了正确级别的动作,我实际上需要能够调用Child的classe特定函数,因此每个子类的行为都不同。

3 个答案:

答案 0 :(得分:1)

你提出的问题没有意义。仅当您在编译时静态地知道要转换的类型时,强制转换才有用,否则您将如何对其进行任何操作?

答案 1 :(得分:1)

简而言之,你不能。你可以使用'动态'允许你编写代码的对象,就好像它已被投射一样,但我认为这不合适。

相反,你可以尝试类似的东西:

class ManagerAccessPoint
{
    private ConfigManager _configManager;
    private SettingsManager _settingsManager;

    void Receive(Action action)
    {
        var configs = action as ConfigsAction;
        if (configs != null)
        {
            _configManager.Receive(configs);    
            return;
        }
        var settings = action as SettingsAction;
        if (settings != null)
        {
            _settingsManager.Receive(settings);    
            return;
        }

    }
}

class ConfigManager
{
    void Receive(ConfigsAction action)
    {
      // repeat the same pattern here
      var setToZero = action as SetToZeroAction;
      if (setToZero != null)
      {
          // we have a setToZero action!
      }
      etc...
    }
}

答案 2 :(得分:0)

类结构看起来很好,经理的概念也很好。但是如果你需要调用子类的特定功能,那么我们就会失去/远离抽象概念。 尝试通过虚拟/抽象合同方法处理这些问题。

例如:

    class ManagerAccessPoint
    {
         public void Receive (Action action)
         {
             //where CallContractMethod is an abstract/virtual method
             //which serves as a contract and now via run time polymorphism
             //the appropriate action method will be called.
             //Each and every child class will have different behavior of this action.
             action.CallContractMethod();
         }
    }