公共对象的继承

本文关键字:继承 公共对象 | 更新日期: 2023-09-27 18:17:21

我有以下场景,其中我检索了一组BaseObject类型的对象。我将这些对象按照Object1和Object2类型进行拆分。

现在我有两个类(Plugin1和Plugin2),根据特定的类型,即类型Object1或类型Object2处理这些列表。

正如您在代码中看到的,我需要在各自的类中声明不同的列表。

是否有一种方法可以在基类中设置减速?我仍然需要能够处理列表根据他们的类型在各自的类,即Plugin1和Plugin2。

public class BaseObject {}
public class Object1 : BaseObject {}
public class Object2 : BaseObject {}
public interface IPlugin
{
    void Process();
}
public class BasePlugin : IPlugin
{
    protected MyManager _manager;        
    public BasePlugin(MyManager manager)
    {
        this._manager = manager;            
    }
    public virtual void Process() { }
}
public class Plugin1 : BasePlugin
{
    private List<Object1> _list;
    public Plugin1(MyManager manager, List<Object1> list)
        : base(manager)
    {
        _list = list;
    }
    public override void Process() 
    {
        base.Process();
    }
}
public class Plugin2 : BasePlugin
{
    private List<Object2> _list;
    public Plugin2(MyManager manager, List<Object2> list)
        : base(manager)
    {
        _list = list;
    }
    public override void Process() 
    {
        base.Process();
    }
}

公共对象的继承

您应该能够使IPlugin接口通用,即

public interface IPlugin<T> where T: BaseObject 
{
    void Process();
}
public class BasePlugin<T> : IPlugin<T>
{
    protected MyManager _manager;        
    protected List<T> _list;
    public BasePlugin(MyManager manager, List<T> list)
    {
        this._manager = manager;    
       _list = list;        
    }
    public virtual void Process() {... }
}

现在,如果Plugin1Plugin2的代码相同,只是类型不同,它们就变成:

var plugin1 = new BasePlugin<Object1>();
var plugin2 = new BasePlugin<Object2>();

。您根本不需要这些类,只需在声明时指定类型即可。

泛型似乎已经完成了任务。

https://msdn.microsoft.com/en-us/library/512aeb7t.aspx

public abstract class BaseObject {}
public class Object1 : BaseObject {}
public class Object2 : BaseObject {}
public interface IPlugin
{
    void Process();
}
public class BasePlugin<T> : IPlugin where T : BaseObject
{
    protected MyManager _manager;        
    protected List<T> _list;
    public BasePlugin(MyManager manager, List<T> list)
    {
        this._manager = manager;            
        this._list = list;
    }
    public virtual void Process() { }
}
public class Plugin1 : BasePlugin<Object1>
{    
    public Plugin1(MyManager manager, List<Object1> list)
        : base(manager, list) { }
    public override void Process() 
    {
        base.Process();
    }
}
public class Plugin2 : BasePlugin<Object2>
{
    public Plugin2(MyManager manager, List<Object2> list)
        : base(manager, list) { }
    public override void Process() 
    {
        base.Process();
    }
}