这是我的结构:
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特定函数,因此每个子类的行为都不同。
答案 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();
}
}