取决于参数的方法的不同变体

时间:2015-09-25 00:44:13

标签: java function types formatter

我有一个名为ctdl_User,ctdl_Device和ctdl_Options的类。

我有一个使用二进制格式化程序保存ctdl_User对象的函数,以及另一个加载它们的函数。但是,函数特别期望获取和返回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();

    }

2 个答案:

答案 0 :(得分:0)

假设这是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

您可以阅读有关GitHub

的更多信息

答案 1 :(得分:0)

以下演示了在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();
}

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

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(),用于保存和加载设备以及用户。