gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:21 24 4
gpt4 key购买 nike

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

最佳答案

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

关于c# - 定义处理派生类集合的基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34986566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com