Skip to main content
 首页 » 编程设计

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

2024年05月10日39落叶

我正在尝试在我的基类中放置一个通用的 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); } 
}