c# - 如何为一组具有几乎相同功能但具有不同参数和返回类型的类创建接口(interface)?

标签 c# generics inheritance polymorphism

我有一系列的类(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/

相关文章:

java - 泛型和类,在构造函数中决定子类

c++ - 使用 C++ 导出重载函数

generics - 通用超特征/需要一揽子 impl

generics - 我对同一个类有两个 Kotlin 扩展方法,但是具有不同的通用签名并且编译器会提示

Javascript 命名空间

css - 我的类(class)拒绝将其规则应用于列表

c# - 如何设置 WNetAddConnection2 的 CONNECT_PROMPT?

c# - C# 原始数据类型是该语言的一部分吗?

c# - 检查形状之间碰撞的设计模式

C# System.Windows.Automation 获取元素文本