В настоящее время у меня есть немного дилемма дизайна. У меня есть абстрактный класс Firmware
, который обрабатывает передачу файлов (обновление прошивки) и некоторые другие вещи, такие как версия.Создание класса указателей плохая идея? (C#)
Проблема в том, что я хочу обновить пути к файлам всех MyFirmware
s во всех Device
s, которые у меня есть. Один из способов сделать это - иметь статический список Device
s в Device
, который я перебираю по обновлению Device.FilePath
, всякий раз, когда я устанавливаю FirmwareFilePath
или получаю событие от Firmware
, что это FilePath
, изменилось, не забудьте очистить их так далее.
** Edit - сделал этот пример более полной *
public class Firmware
{
private string _path;
public string Path
{
get { return _path; }
set
{
if (_path == value)
return;
_path = value;
OnPropertyChanged("Path");
}
}
}
public class Device
{
private static readonly List<Device> _Bars = new List<Device>();
private readonly Firmware _myFirmware = new Firmware() ;
public Firmware MyFirmware
{
get { return _myFirmware; }
}
public Device()
{
_Bars.Add(this);
Firmware.PropertyChanged += NewPath;
}
private void NewPath (object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Path")
{
foreach (var dev in _Bars)
dev.MyFirmware.Path = MyFirmware.Path;
}
}
}
Или я мог бы использовать "указатель", изменить Getter, сеттер и CTOR немного.
public class Pointer<TField>
{
private TField _backingField;
public TField GetValue()
{
return _backingField;
}
public void SetValue(TField value)
{
_backingField = value;
}
}
public class Firmware
{
private Pointer<string> _pPath;
public string Path
{
get { return _pPath.GetValue(); }
set { _pPath.SetValue(value); }
}
public Firmware (Pointer<String> pPath)
{
_pPath = pPath;
}
}
public class Device
{
private static readonly Pointer<String> _PPath = new Pointer<string>();
public static string Path
{
get { return _PPath.GetValue(); }
set { _PPath.SetValue(value); }
}
private readonly Firmware _myFirmware = new Firmware(_PPath);
public Firmware MyFirmware
{
get { return _myDevice; }
}
}
Есть ли согласованная причина, почему это было бы плохой практикой? Есть ли какая-либо ГК-ловушка, которую я не заметил?
Ваше описание того, что вы хотите сделать, было бы более ясным, если бы оно было более конкретным, чем просто «foo» и «bar». Как бы то ни было, трудно понять, что вы делаете. Интуитивно, я думаю, вам просто нужна коллекция этих объектов. –
Согласовано. Foo, Bar и Baz являются порождениями дьявола :) – cwap
Я думаю, что у меня есть все :) –