定义处理派生 class 集合的基础 class 方法
Define base class method working on derived class collection
我正在尝试在我的基础 class 中放置一个通用的 Add 方法,该方法将适用于不同类型的 classes,所有实现 ICollection。到目前为止一切顺利,我可以使用 boxing/unboxing 来实现我想要的,但我想知道是否有更好的方法来做到这一点。我很少使用协变接口,但没有更大的运气 - 甚至可以定义 IVariantCollection?
这是一段代码,可以解释我试图实现的目标:
public abstract class Device
{
public string Name { get; set; }
public abstract void Print();
}
public class Printer : Device { public override void Print() => Debug.WriteLine($"{Name} printer printout"); }
public class Xero : Device { public override void Print() => Debug.WriteLine($"{Name} xero printout."); }
public abstract class Factory
{
public abstract IEnumerable<Device> DeviceCollection { get; }
public abstract void Add(object added);
public void ListDevices() { foreach (var item in DeviceCollection) Debug.WriteLine($"Device: {item.Name}"); }
}
public class PrinterFactory : Factory
{
public List<Printer> Printers = new List<Printer>();
public override IEnumerable<Device> DeviceCollection => Printers;
public override void Add(object added) { Printers.Add((Printer)added); }
}
public class XeroFactory : Factory
{
public ObservableCollection<Xero> Xeros = new ObservableCollection<Xero>();
public override IEnumerable<Device> DeviceCollection => Xeros;
public XeroFactory() { Xeros.CollectionChanged += (s, e) => Debug.WriteLine($"Device added: {e.NewItems[0]}"); }
public override void Add(object added) { Xeros.Add((Xero)added); }
}
代码有效,但我不喜欢这种使用 object 的解决方案 - 是否有其他方法来定义 Add 方法,也许是基础 class?
中的通用版本
使用带有基础 class 约束的通用 Factory
public abstract class Factory<TDevice> where TDevice : Device
{
public abstract IEnumerable<TDevice> DeviceCollection { get; }
public abstract void Add(TDevice added);
public void ListDevices()
{
foreach (var item in DeviceCollection)
Debug.WriteLine($"Device: {item.Name}");
}
}
然后
public class PrinterFactory : Factory<Printer>
{
public List<Printer> Printers = new List<Printer>();
public override IEnumerable<Printer> DeviceCollection => Printers;
public override void Add(Printer added) { Printers.Add(added); }
}
我正在尝试在我的基础 class 中放置一个通用的 Add 方法,该方法将适用于不同类型的 classes,所有实现 ICollection。到目前为止一切顺利,我可以使用 boxing/unboxing 来实现我想要的,但我想知道是否有更好的方法来做到这一点。我很少使用协变接口,但没有更大的运气 - 甚至可以定义 IVariantCollection?
这是一段代码,可以解释我试图实现的目标:
public abstract class Device
{
public string Name { get; set; }
public abstract void Print();
}
public class Printer : Device { public override void Print() => Debug.WriteLine($"{Name} printer printout"); }
public class Xero : Device { public override void Print() => Debug.WriteLine($"{Name} xero printout."); }
public abstract class Factory
{
public abstract IEnumerable<Device> DeviceCollection { get; }
public abstract void Add(object added);
public void ListDevices() { foreach (var item in DeviceCollection) Debug.WriteLine($"Device: {item.Name}"); }
}
public class PrinterFactory : Factory
{
public List<Printer> Printers = new List<Printer>();
public override IEnumerable<Device> DeviceCollection => Printers;
public override void Add(object added) { Printers.Add((Printer)added); }
}
public class XeroFactory : Factory
{
public ObservableCollection<Xero> Xeros = new ObservableCollection<Xero>();
public override IEnumerable<Device> DeviceCollection => Xeros;
public XeroFactory() { Xeros.CollectionChanged += (s, e) => Debug.WriteLine($"Device added: {e.NewItems[0]}"); }
public override void Add(object added) { Xeros.Add((Xero)added); }
}
代码有效,但我不喜欢这种使用 object 的解决方案 - 是否有其他方法来定义 Add 方法,也许是基础 class?
中的通用版本使用带有基础 class 约束的通用 Factory
public abstract class Factory<TDevice> where TDevice : Device
{
public abstract IEnumerable<TDevice> DeviceCollection { get; }
public abstract void Add(TDevice added);
public void ListDevices()
{
foreach (var item in DeviceCollection)
Debug.WriteLine($"Device: {item.Name}");
}
}
然后
public class PrinterFactory : Factory<Printer>
{
public List<Printer> Printers = new List<Printer>();
public override IEnumerable<Printer> DeviceCollection => Printers;
public override void Add(Printer added) { Printers.Add(added); }
}