[英]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.