【问题标题】:Refactoring: Extracting interface in C#重构:在 C# 中提取接口
【发布时间】:2015-08-06 10:07:18
【问题描述】:

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

BeamColumn 都派生自 SObject 类。

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);
}

【问题讨论】:

  • 你想达到什么目的?
  • 我正在尝试提取接口。更新了问题。
  • 他们有不同的方法,那么你打算如何创建接口呢?您已经有一个版本,有什么问题,您希望如何完成?
  • @SamiKuhmonen 也许我在这里遗漏了一些东西,我想如果我可以定义一个界面,那将是一个很好的设计。
  • @Vahid 如果您不需要界面,它实际上不会为设计添加任何内容。根据接口的数量,它并没有变得更好。提到了通用接口,如果你真的需要一个接口,这可能是要走的路。

标签: c# inheritance interface refactoring


【解决方案1】:

你可能想要这样的东西:

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);
    }
}

或者,您可以只定义一个泛型类,这样您就不需要不断添加 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());

【讨论】:

  • 我试图使用接口,以便我可以在实现接口的类中保持统一的实现。这是个坏主意吗?
  • 这取决于。如果所有实现接口的类除了公开集合并添加到它之外什么都不做,那么如果你的项目有很多类,那么你的项目可能会变得臃肿。或者,只需定义一个允许您执行此操作的类,这似乎是我的最新编辑。
猜你喜欢
  • 2016-03-03
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多