繁体   English   中英

如何在C#抽象方法中指定可选的匿名可枚举参数

[英]how to specify optional anonymous ienumerable parameters in c# abstract method

我有以下基础课

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参数,然后可以根据需要使用。

GetAll(IEnumerable<Customer> Customers)函数相当于一个新方法。 它没有基的相同签名,因此不能以这种方式覆盖。 SalesRepository类(如果要成为BaseRepository<Sales> )必须GetAll()实现GetAll()方法。

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

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

你可以做这个改变

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM