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

Different variants of method depending on parameters

我有 类 叫 ctdl_User、ctdl_Device 和 ctdl_Options。

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

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

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 你可以按照这个方案重载方法:

    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

下面演示了在 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() 添加了保存和加载设备以及用户的代码。