通过继承设计具有共享功能的静态类

时间:2013-09-19 13:03:16

标签: c# database

我有许多静态存储库类来保存和检索数据对象。我想为它们提供一些常用功能,所以我让它们从一个抽象类继承。

这不起作用,因为不允许静态类继承。我相信.NET设计,所以我会接受这是有充分理由的。

所以这让我相信我在这里有一些基本的设计问题。

我的问题是如何设计我的代码以实现我正在寻找的结果?或者,只是必须在我的所有类中复制方法。也许是单身人士?

静态回购:

public static class CreditMemos : InvoiceRepository<CreditMemo>
{
    public static List<CreditMemo> GetByDocumentNumber(string documentNumber)
    {
        return CheckCache(
            ConvertReaderToCreditMemos(
                Invoices.GetByDocumentNumber<CreditMemo>(documentNumber)));
    }
}

所需基数:

abstract class InvoiceRepository<t>
    where t: DataObjects.Invoice
{
    static List<t> invoiceCache = new List<t>();

    static protected List<t> CheckCache(List<t> results)
    {
        foreach (var result in results)
            if (!invoiceCache.Any(p => p.ID == result.ID))
                invoiceCache.Add(result);
        return invoiceCache.Where(p => results.Any(a => a.ID == p.ID)).ToList();
    }
}

1 个答案:

答案 0 :(得分:4)

您可以从继承类中删除static,并通过隐藏构造函数使它们的工作方式类似:

public sealed class CreditMemos : InvoiceRepository<CreditMemo>
{
    private CreditMemos() { }
    ...

或者您可以将InvoiceRepository<t>设为自己的static class,而不是继承,只需使用其他static class es中的方法即可。 (顺便说一句,约定是将所有类型名称中的第一个字母大写,包括泛型类型,因此T,而不是t

public static class CreditMemos
{
    public static List<CreditMemo> GetByDocumentNumber(string documentNumber)
    {
        return InvoiceRepository<CreditMemo>.CheckCache(new List<CreditMemo>());
    }
}
public static class InvoiceRepository<T>
    where T: DataObjects.Invoice
{
    static List<T> invoiceCache = new List<T>();

    static internal List<T> CheckCache(List<T> results)
    {
        foreach (var result in results)
            if (!invoiceCache.Any(p => p.ID == result.ID))
                invoiceCache.Add(result);
        return invoiceCache.Where(p => results.Any(a => a.ID == p.ID)).ToList();
    }
}