如何在c抽象方法中指定可选的匿名参数
本文关键字:参数 抽象方法 | 更新日期: 2023-09-27 18:22:44
我有以下基类
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,使其具有可选的可枚举参数,然后根据需要使用
GetAll(IEnumerable<Customer> Customers)
函数相当于一个新方法。它与基的签名不同,因此不能以这种方式重写。如果SalesRepository
类要成为BaseRepository<Sales>
,则必须按原样实现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() });
您可以将参数标记为可选参数,也可以对基类中的方法进行重载,这两者都会导致相同的结果。当您将一个参数标记为可选时,编译器只会为您生成重载。
最终,您可能需要在基类中创建两个方法,然后在每个父类的实现中隐藏一个(使私有),或者让它抛出一个错误。如果你能找到一个很好的方法来设置默认值,那么这也可能奏效。