我有一系列的类(class)几乎都做同样的事情。下面是 2 个 future 的子类:
class ItemWriter
{
private List<Item> items;
public ItemWriter(List<Item> items)
{
this.items= items;
}
public List<Item> Write()
{
using (var ctx = new DatabaseEntities())
{
using(var trx = ctx.Database.BeginTransaction())
{
ctx.Item.AddRange(items);
rowsAdded = ctx.SaveChanges();
trx.Commit();
}
}
return items;
}
}
还有一个……
class ItemShelfWriter
{
private List<ItemShelf> itemShelfs;
public ItemShelfWriter(List<ItemShelf> itemShelfs)
{
this.itemShelfs= itemShelfs;
}
public List<ItemShelf> Write()
{
using (var ctx = new DatabaseEntities())
{
using(var trx = ctx.Database.BeginTransaction())
{
ctx.TtemShelf.AddRange(itemShelfs);
ctx.SaveChanges();
trx.Commit();
}
}
return itemShelfs;
}
}
您可以看到这两个类做几乎相同的事情 - 只是它们写入不同的表并且 Write()
方法具有不同的返回类型。
我想要一个接口(interface)/抽象类 IWriter.cs
,它强制每个子类都有一个返回类型的 Write() 方法和一个接受列表的构造函数。如果我可以删除 Write() 中的一些代码重复,那会很好。
但是,问题在于每个类获取和返回不同的对象并写入不同的数据库表。有什么办法可以实现/改进吗?我有一个模糊的理解,它可能需要使用泛型。
最佳答案
这听起来像是 generics 的好案例:
接口(interface):
public interface IWriter<T>
{
List<T> Write();
}
是否可以删除重复代码取决于您的真实类实际具体执行的操作。根据您展示的代码,您可以这样做:
class Writer<T> : IWriter<T>
{
private List<T> items;
public Writer(List<T> items)
{
this.items= items;
}
public List<T> Write()
{
using (var ctx = new DatabaseEntities())
{
using(var trx = ctx.Database.BeginTransaction())
{
ctx.Item.AddRange(items);
rowsAdded = ctx.SaveChanges(); // what is rowsAdded??
trx.Commit();
}
}
return items;
}
}
您没有声明 rowsAdded
,所以我不知道该怎么做。
您现在可以像这样实例化此类:
var itemWriter = new Writer<Item>(items);
var itemShelfWriter = new Writer<ItemShelf>(itemShelfs);
关于c# - 如何为一组具有几乎相同功能但具有不同参数和返回类型的类创建接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56291483/