簡體   English   中英

轉換為運行時類型

[英]Casting to run-time type

這是我的結構:

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是類型變量

我發現了其他“類似”問題,但沒有一個能為我的情況提供有效的解決方案。

實際上,一旦收到正確級別的操作,我實際上就必須能夠調用Child的班級特定功能,以便每個孩子班級的行為都不同。

您的要求沒有任何意義。 只有在編譯時靜態地知道要轉換的類型時,轉換才有用。否則,您將如何處理?

簡而言之,你不能。 您可以使用“動態”對象,該對象可以讓您像強制轉換一樣編寫代碼,但是我認為這不合適。

相反,您可以嘗試如下操作:

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...
    }
}

班級結構看起來很好,經理的概念也很好。 但是,如果您需要調用子類的特定功能,那么我們將失去/遠離抽象概念。 嘗試通過虛擬/抽象合同方法來處理這些問題。

例如:

    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();
         }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM