C#与字典的多态性无法正常工作

时间:2014-06-24 12:22:00

标签: c# dictionary polymorphism

我有一个抽象的基类

public abstract class absTerminalStrategy
{
//....
}

和两个子课程可以调用Class AClass B

Class A
{
//Some Params
  public A (/*Some Params*/)
}

Class B
{
//Some Params
  Public B (/*Some Params*/)
}

in" upper"图层类I' ll Class Control 我是那些对象

{
//..
        public static absTerminalStrategy terminal = null;
        /// <summary>
        /// stores all instencese of A_tarategy to be used --> string A_IP
        /// </summary>
        public static Dictionary<string, A> terminal_A_Dictionary = new Dictionary<string, A_Strategy>();
        /// <summary>
        /// stores all instencese of B_Scritping to be used --> string B_Port
        /// </summary>
        public static Dictionary<string, B> terminal_B_Dictionary = new Dictionary<string, B_trategy>();
//..
}

现在在运行时我将一些实例添加到词典中,之后我需要&#34;跳转&#34;之间 使用此方法的各种实例

public static bool Terminalset(string terminalName)
{
    string InterfaceType = terminalName.Split(':')[0];//cutting the root name for switch
    switch(InterfaceType)
    {
        case "A":
            {
                A New_A =null;

                if (terminal_A_Dictionary.TryGetValue(terminalName, out New_A))//return bool 
                    terminal = New_A;
                else return false;
            }
            break;
        case "B":
            {
                B New_B =null;
                if (terminal_B_Dictionary.TryGetValue(terminalName, out New_B))//return bool 
                    terminal = New_B;
                else return false;
            }
            break;
    }
    return true;
}

我的问题是,当我在class Aclass B之间切换时,一切正常                 当我使用字典在class A的实例之间进行更改时,它似乎工作正常 但是当我对Class B执行相同操作时,我无法工作并保留最后一个属性以输入字典(最后输入的new个实例)< / p>

可能是什么问题?

这也就是如何添加到词典

    public static bool TermialCheckCreate (TerminalType terminalType , GlobalParam.A a = null , GlobalParam.B b= null)
    {
        switch (terminalType)
        {
            case TerminalType.A:
                {
                    if (terminal_A_Dictionary.ContainsKey(string.Format("A:{0}", _A_Param.AIp))) break;
                    if (a == null) return false;
                    A_Strategy terminal = new A_Strategy(_A_Param.AIp, GlobalParam.A_PORT, 60);
                    terminalTelnetDictionary.Add(string.Format("A:{0}",_A_Param.AIp), terminal);
                }
                break;
            case TerminalType.B:
                {
                    if (terminal_B_Dictionary.ContainsKey(string.Format("B:{0}", _B_Param.Bcom))) break;
                    if (b == null) return false;
                    B_strategy terminal = new B_Strategy(GlobalParam.AppDirectory, _B_Param.BCom, _B_Param.BRate);
                    terminal_B_Dictionary.Add(string.Format("B:{0}",_B_Param.BCom), terminal);  
                }
                break;
        }
        return true;
    }

编辑小修正

所涉及的课程副本

用于控制所有词典的课程

public enum TerminalType {serial , Telent };
public static class TerminalControl
{
    /// <summary>
    /// stores all instencese of TelnetStarategy to be used --> string telnetIP
    /// </summary>
    public static Dictionary<string, TelnetStrategy> terminalTelnetDictionary = new Dictionary<string, TelnetStrategy>();
    /// <summary>
    /// stores all instencese of SerialScritping to be used --> string SerailPort
    /// </summary>
    public static Dictionary<string, SerialStrategy> terminalSerialDictionary = new Dictionary<string, SerialStrategy>();
    /// <summary>
    /// abstract instance , chooses between serial and telent
    /// </summary>
    public static absTerminalStrategy terminal = null;
    /// <summary>
    /// static constructor
    /// </summary>
    static TerminalControl()
    {

    }
    /// <summary>
    /// Inherits from serial/telnet strategy will run this class of commands 
    /// </summary>
    /// <param name="terminalType"></param>
    /// <param name="TelnetIP"></param>
    /// <param name="SerialPort"></param>
    /// <param name="SerialBaudRate"></param>
    /// <param name="Command"></param>
    /// <returns></returns>
    public static List<string> TerminalSendAndWaitForList(string Command,string terminalName,string fullpathLog="")
    {
        if (!Terminalset(terminalName)) return new List<string>(new string[] { "ERROR : Device Not Found !!! Check it and add" });
        return  terminal.SendAndWaitForList(Command);     
    }

    public static bool Terminalset(string terminalName)
    {
        string InterfaceType = terminalName.Split(':')[0];
        switch(InterfaceType)
        {
            case "Telnet":
                {
                    TelnetStrategy NewTelnet =null;
                    terminal = NewTelnet;
                    if (terminalTelnetDictionary.TryGetValue(terminalName, out NewTelnet))//return bool 
                        terminal = NewTelnet;
                    else return false;
                }
                break;
            case "Serial":
                {
                    SerialStrategy NewSerial =null;
                    terminal = NewSerial;
                    if (terminalSerialDictionary.TryGetValue(terminalName, out NewSerial))//return bool 
                        terminal = NewSerial;
                    else return false;
                }
                break;
        }
        return true;
    }
    /// <summary>
    /// added new terminal to inner dictionary
    /// </summary>
    /// <param name="terminalType"></param>
    /// <param name="telentParam"></param>
    /// <param name="serialParam"></param>
    /// <returns></returns>
    public static bool TermialCheckCreate (TerminalType terminalType , GlobalParam.TelentParams telentParam = null , GlobalParam.SerialParams serialParam= null)
    {
        switch (terminalType)
        {
            case TerminalType.Telent:
                {
                    if (terminalTelnetDictionary.ContainsKey(string.Format("Telnet:{0}", telentParam.telnetIp))) break;
                    if (telentParam == null) return false;
                    TelnetStrategy terminal = new TelnetStrategy(telentParam.telnetIp, GlobalParam.TELNET_PORT, 60);
                    terminalTelnetDictionary.Add(string.Format("Telnet:{0}",telentParam.telnetIp), terminal);
                }
                break;
            case TerminalType.serial:
                {
                    if (terminalSerialDictionary.ContainsKey(string.Format("Serial:{0}", serialParam.SerialCom))) break;
                    if (serialParam == null) return false;
                    SerialStrategy terminal = new SerialStrategy(GlobalParam.AppDirectory, serialParam.SerialCom, serialParam.SerialBaudRate);
                    terminalSerialDictionary.Add(string.Format("Serial:{0}",serialParam.SerialCom), terminal);  
                }
                break;
        }
        return true;
    }



}

抽象基础和子项只显示名称和构造函数(如果需要,我将发布整个代码....)

public abstract class absTerminalStrategy
{
    public abstract List<string> SendAndWaitForList(string Command);
    public abstract bool WaitForOutPut(string Blocker, int secTimeOut);//implement Wait for Output string before releasing lock (Monitor.wait/Pulse) 

}



public class SerialStrategy : absTerminalStrategy
{
    public ScriptingSerial serailAgent = null;//Infrastructure
    public SerialStrategy(string fullPathLog , string PortName , int Baudrate)
    {
        serailAgent = new ScriptingSerial(fullPathLog, PortName, Baudrate);
    }
 //....
}

public class TelnetStrategy : absTerminalStrategy
{
    public static event SerialDataInput_EventHandler onDataInput;
    public static ScriptingTelnet telnetAgent = null;//Infrastructure
    public string TelnetIp = string.Empty;
    public TelnetStrategy(string Ip, int Port, int CommandTimeOut)
    {
        TelnetIp = Ip;
        int port = Port;
        telnetAgent = new ScriptingTelnet(Ip, port, CommandTimeOut);
    }
}

0 个答案:

没有答案