0

我有以下基类

public abstract class BaseRepository<T>
{
    public abstract IEnumerable<T> GetAll();
}

一个继承它的类。

public class CustomerRepository: BaseRepository<Customer>
{
    public override IEnumerable<Customer>GetAll()
    {
        return null;
    }
}


public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我想做的是使用这个类

public class Sales
{
    public int Id { get; set; }
    public int CustomerId {get;set;}
    public decimal Total {get;set;}
}

这不起作用

public class SalesRepository: BaseRepository<Sales>
{
    public override IEnumerable<Sales>GetAll(IEnumerable<Customer> Customers)
    {
        return null;
    }
}

我的问题是,如何修改我的 BaseClass 以具有可选的 ienumerable 参数,然后我可以根据需要使用这些参数。

4

3 回答 3

4

GetAll(IEnumerable<Customer> Customers)功能相当于一种新方法。它没有相同的基础签名,因此不能以这种方式覆盖。如果SalesRepository类是 a BaseRepository<Sales>,则必须按原样实现该GetAll()方法。

于 2013-07-16T17:27:44.563 回答
1

您可以将参数标记为可选,也可以对基类中的方法进行重载,这两者都会产生相同的结果。当您将参数标记为可选时,编译器只会为您生成重载。

最终,您可能需要在基类中创建两个方法,然后在每个父类的实现中隐藏一个(设为私有)或让它抛出错误。如果您能找到一种获得默认值的好方法,那么它也可能会起作用。

于 2013-07-16T17:28:03.360 回答
1

你可以做这个改变

public class SalesRepository : BaseRepository<Sales>
{
    public override IEnumerable<Sales> GetAll()
    {
        return GetAll(null);
    }

    public IEnumerable<Sales> GetAll(IEnumerable<Customer> Customers)
    {
        return null;
    }
}

BaseRepository<Sales> rep = new SalesRepository();
rep.GetAll();

这将调用被覆盖的版本并调用 GetAll(null)。要将值传递给 GetAll() 方法,您需要执行以下操作

SalesRepository srep = new SalesRepository();
srep.GetAll(new Customer[] { new Customer() });
于 2013-07-16T17:54:23.410 回答