2015-09-25 22 views
0

У меня есть классы 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(); 

    } 

ответ

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(); 
} 

Обратите внимание на использование new() constraint в методе Load(). Вот пример вызова этих методов:

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; 
} 

Edit: добавлен код для Main(), что позволяет экономить и загружает устройство , а также пользователя.

+0

Отлично! Большое спасибо за это. – Astyy

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 

Кроме того, если у вас есть общий код для него, которые могут быть использованы для объектов других типов вы можете exrtact этого кода на один Methode, что лечить перегруженные методы, как фасад

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

 Смежные вопросы

  • Нет связанных вопросов^_^