重构:在 C# 中提取接口

Refactoring: Extracting interface in C#

我正在尝试为 BeamsCollectionColumnsCollection 提取接口 IObjectsCollection。但是我卡住了。

BeamColumn 均派生自 SObject class。

public class BeamsCollection : IObjectsCollection
{
    public List<Beam> SObjects{ get; private set; }

    public BeamsCollection ()
    {
        SObjects = new List<Beam>();
    }

    public void Add(Beam beam)
    {
        SObjects.Add(beam);
    }
}

public class ColumnsCollection : IObjectsCollection
{
    public List<Column> SObjects{ get; private set; }

    public ColumnsCollection ()
    {
        SObjects= new List<Column>();
    }

    public void Add(Column column)
    {
        SObjects.Add(column);
    }
}

public interface IObjectsCollection
{
    List<SObject> SObjects{ get; }
    void Add(SObject sobject);
}

您可能想要这样的东西:

public interface IObjectsCollection<T> where T : SObject
{
    List<T> Items{ get; }
    void Add(T item);
}

public class BeamsCollection : IObjectsCollection<Beam>
{
    public List<Beam> Items { get; private set; }

    public BeamsCollection ()
    {
        Items = new List<Beam>();
    }

    public void Add(Beam item)
    {
        Items.Add(beam);
    }
}

public class ColumnsCollection : IObjectsCollection<Column>
{
    public List<Column> Items { get; private set; }

    public ColumnsCollection ()
    {
        Items = new List<Column>();
    }

    public void Add(Column item)
    {
        Items.Add(column);
    }
}

或者,您可以只定义一个泛型 class,这样您就不需要继续添加 IObjectsCollection

的新实现
public class MyObjectsCollection<T> where T : SObject
{
 //....rest of class ommitted.
}

然后使用它:

MyObjectsCollection<Beam> m1 = new MyObjectsCollection<Beam>();
m1.Items.Add(new Beam());

MyObjectsCollection<Column> m2 = new MyObjectsCollection<Column>();
m2.Items.Add(new Column());