定义处理派生类集合的基类方法

本文关键字:基类 类方法 集合 处理 派生 定义 | 更新日期: 2023-09-27 18:31:54

我正在尝试在我的基类中放置一个通用的 Add 方法,该方法适用于不同类型的类,所有这些都实现了 ICollection。到目前为止一切顺利,我能够使用装箱/拆箱来实现我想要的,但我想知道是否有更好的方法来做到这一点。我对协变接口玩得很少,但没有更好的运气 - 甚至有可能定义 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); }
}

代码有效,但我不知何故不喜欢这个带有对象的解决方案 - 有没有其他方法可以定义 Add 方法,也许是基类中的通用方法?

定义处理派生类集合的基类方法

使用具有基类约束的泛型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); }
}