【问题标题】:Different variants of method depending on parameters方法的不同变体取决于参数
【发布时间】:2015-12-22 17:59:22
【问题描述】:

我有名为 ctdl_User、ctdl_Device 和 ctdl_Options 的类。

我有一个使用二进制格式化程序保存 ctdl_User 对象的函数,以及另一个加载它们的函数。然而,这些函数特别希望获取和返回用户对象,我想使用这个函数来加载我的其他对象。

如何更改函数将采用的类型?这是保存和加载功能...

public ctdl_User Load()
    {
        ctdl_User loadedUsr = new ctdl_User();
        string DataFileSave = Settings.Default.savePath + "\\testuserfile.dat";
        FileStream dataStr = new FileStream(DataFileSave, FileMode.Open);
        BinaryFormatter frmtr = new BinaryFormatter();
        loadedUsr = (ctdl_User) frmtr.Deserialize(dataStr);
        dataStr.Close();
        return loadedUsr;
    }

public static void Save(ctdl_User usr)
    {
        string DataFileSave = Settings.Default.savePath + "\\testuserfile.dat";
            File.Delete(DataFileSave);
            FileStream dataStr = new FileStream(DataFileSave, FileMode.Create);
            BinaryFormatter frmtr = new BinaryFormatter();
            frmtr.Serialize(dataStr, usr);
            dataStr.Close();

    }

【问题讨论】:

    标签: java function types formatter


    【解决方案1】:

    假设这是 Java,您可以按照以下方案重载方法:

        public static void Load(Type1 obj)
        {
            //do sth with object of type Type1
        }
    
        public static void Load(Type2 obj)
        {
            //do sth with object of type Type2
        }
    
        //...etc
    

    此外,如果您有可用于其他类型对象的通用代码,您可以将此代码提取到一个将重载方法视为外观的方法

        private static void doLoad(Object obj)
        {
            //the common code
        }
    
        public static void Load(Type1 obj)
        {
            doLoad(obj); // or something else...
        }
    
        public static void Load(Type2 obj)
        {
            doLoad(obj); // or something else...
        }
    
        //...etc
    

    你可以阅读更多关于overloading methods in Java here

    【讨论】:

      【解决方案2】:

      以下演示了在 C# 中使用泛型的方法:

      public static T Load<T>() where T : new()
      {
          T loadedUsr = new T();
          string DataFileSave = Settings.Default.savePath + "\\testuserfile.dat";
          FileStream dataStr = new FileStream(DataFileSave, FileMode.Open);
          BinaryFormatter frmtr = new BinaryFormatter();
          loadedUsr = (T) frmtr.Deserialize(dataStr);
          dataStr.Close();
          return loadedUsr;
      }
      
      public static void Save<T>(T usr)
      {
          string DataFileSave = Settings.Default.savePath + "\\testuserfile.dat";
          File.Delete(DataFileSave);
          FileStream dataStr = new FileStream(DataFileSave, FileMode.Create);
          BinaryFormatter frmtr = new BinaryFormatter();
          frmtr.Serialize(dataStr, usr);
          dataStr.Close();
      }
      

      注意new() constraintLoad() 方法中的使用。 以下是调用这些方法的示例:

      public static void Main(string[] args)
      {
          ctdl_User user = new ctdl_User();
          user.name = "Alice";
          Save<ctdl_User>(user);
          ctdl_User user2 = Load<ctdl_User>();
          Console.WriteLine(user2.name);
      
          ctdl_Device device = new ctdl_Device();
          device.type = "printer";
          Save<ctdl_Device>(device);
          ctdl_Device device2 = Load<ctdl_Device>();
          Console.WriteLine(device2.type);
      }
      

      为了完整起见,这里是我用来测试这段代码的存根类:

      [Serializable()]
      class ctdl_User
      {
          public string name;
      }
      
      [Serializable()]
      class ctdl_Device
      {
          public string type;
      }
      

      编辑:将代码添加到Main(),用于保存和加载设备以及用户。

      【讨论】:

      • 完美!非常感谢。
      猜你喜欢
      • 2018-12-16
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2015-03-23
      相关资源
      最近更新 更多